Selvom SQL Server er ekstremt kraftfuld som en relationsdatabase, kan den til tider være noget skræmmende, når det kommer til at finde underliggende information om selve databasesystemet.
For at lindre disse hovedpine i en lille del, vil vi kort undersøge, hvordan man finder alle tabeller i databasen, som indeholder et bestemt kolonnenavn .
SQL-serverkatalogvisninger
Et grundlæggende koncept at forstå om SQL Server er catalog views
, som reelt er databasetabeller (catalogs
i dette tilfælde), der viser systemdækkende information om SQL Server Database Engine.
Forespørgsel efter systemoplysninger
Alle catalog views
tilgås via en SELECT
SQL-sætning FROM
et specifikt katalog i sys.
navneområde.
For eksempel kan følgende sætning bruges til at se information om alle databasetabeller i systemet via sys.tables
katalog:
SELECT
*
FROM
sys.tables
LIKE-erklæring og jokertegn
Før vi kommer ind på, hvordan man udtrækker alle tabeller med et bestemt navn, bør vi kort undersøge, hvad LIKE
sætningen gør, såvel som jokertegnet (%
) symbol, og hvordan de bruges sammen.
LIKE
bruges i en forespørgsel til at bestemme, om et bestemt mønster af tegn (typisk værdierne af en specificeret column
) matcher en formateret streng af tegn.
LIKE
bruges ofte også sammen med %
tegn, som repræsenterer et jokertegn, når man forsøger at matche mønsteret. Når en %
jokertegn er til stede i mønsterstrengen, angiver det, at enhver tegn kan være til stede på denne placering af mønsterstrengen og stadig betragtes som et match.
For eksempel, hvis vi ønsker at finde alle bøger, hvor title
begynder med "The", men kan indeholde alle tegn derefter, vil vi bruge en erklæring som sådan:
SELECT
title,
primary_author,
published_date
FROM
books
WHERE
title LIKE 'The%'
Observante læsere vil måske indse, at ovenstående mønster ikke kun ville matche titler, der havde "The" i begyndelsen, men også alle titler med ord, der simpelthen starter med de tre bogstaver "The" også. Siden %
jokertegn matcher alle tegn, hvis vi kun ønsker at tjekke for titler med ordet "The", er det mere passende at tilføje et mellemrum:
SELECT
title,
primary_author,
published_date
FROM
books
WHERE
title LIKE 'The %'
Valg af tabeller, der indeholder et kolonnenavn
Med vores grundlæggende viden om begge catalog views
og LIKE
sætning, er vi nu udstyret til at slå alle tabeller i vores system op, der indeholder et bestemt kolonnenavn:
SELECT
sys.columns.name AS ColumnName,
tables.name AS TableName
FROM
sys.columns
JOIN sys.tables ON
sys.columns.object_id = tables.object_id
WHERE
sys.columns.name = 'ColumnName'
Vi skal kombinere oplysninger fra to kataloger, sys.tables
og sys.columns
, så vi bruger en JOIN
udmelding. De to er forbundet med object_id
felt, så vi JOIN
på det felt.
Derfra er det et simpelt spørgsmål om at vælge ColumnName
og TableName
af vores resultater, og til sidst selvfølgelig kun at slå op på poster, hvor sys.columns.name
er lig med vores ColumnName
streng.
Denne forespørgsel vil dog kun finde nøjagtige match af kolonnenavnet. Hvis vi ønsker at finde delvise matches, kan vi bruge LIKE
og %
jokertegn i stedet:
SELECT
sys.columns.name AS ColumnName,
tables.name AS TableName
FROM
sys.columns
JOIN sys.tables ON
sys.columns.object_id = tables.object_id
WHERE
sys.columns.name LIKE '%ColumnName%'
Der har vi det! En simpel forespørgsel til at slå alle tabeller og tilknyttede kolonner op med et bestemt (eller lignende) kolonnenavn i dem.