Hoewel het extreem krachtig is als relationele database, kan SQL Server soms wat ontmoedigend zijn als het gaat om het opzoeken van onderliggende informatie over het databasesysteem zelf.
Om deze hoofdpijn voor een deel te verlichten, zullen we kort onderzoeken hoe we alle tabellen in de database kunnen vinden die een bepaalde kolomnaam bevatten. .
SQL Server-catalogusweergaven
Een basisconcept om te begrijpen over SQL Server is dat van catalog views
, die in feite databasetabellen zijn (catalogs
in dit geval) die systeembrede informatie over de SQL Server Database Engine weergeven.
Systeeminformatie opvragen
Alle catalog views
zijn toegankelijk via een SELECT
SQL-instructie FROM
een specifieke catalogus binnen de sys.
naamruimte.
De volgende instructie kan bijvoorbeeld worden gebruikt om informatie over alle databasetabellen in het systeem te bekijken via de sys.tables
catalogus:
SELECT
*
FROM
sys.tables
LIKE-statement en jokerteken
Voordat we ingaan op het extraheren van alle tabellen met een bepaalde naam, moeten we kort onderzoeken wat de LIKE
statement doet, evenals het jokerteken (%
) symbool en hoe ze samen worden gebruikt.
LIKE
wordt gebruikt in een query om te bepalen of een bepaald patroon van tekens (meestal de waarden van een opgegeven column
) overeenkomen met een opgemaakte tekenreeks.
LIKE
wordt vaak ook gebruikt in combinatie met de %
teken, dat een jokerteken vertegenwoordigt wanneer wordt geprobeerd het patroon te evenaren. Wanneer een %
jokerteken is aanwezig in de patroontekenreeks, dit geeft aan dat elke tekens kunnen aanwezig zijn op die locatie van de patroontekenreeks en toch als een overeenkomst worden beschouwd.
Als we bijvoorbeeld alle boeken willen vinden waar de title
begint met "The" maar daarna alle tekens kan bevatten, zouden we een verklaring als volgt gebruiken:
SELECT
title,
primary_author,
published_date
FROM
books
WHERE
title LIKE 'The%'
Oplettende lezers realiseren zich misschien dat het bovenstaande patroon niet alleen overeenkomt met titels met "The" aan het begin, maar ook met titels met woorden die gewoon beginnen met de drie letters "The". Sinds %
wildcards komen overeen met alle tekens, als we alleen willen controleren op titels met het woord "The", is het toevoegen van een spatie meer geschikt:
SELECT
title,
primary_author,
published_date
FROM
books
WHERE
title LIKE 'The %'
Tabellen selecteren met een kolomnaam
Met onze basiskennis van beide catalog views
en de LIKE
statement, zijn we nu uitgerust om alle tabellen in ons systeem op te zoeken die een bepaalde kolomnaam bevatten:
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'
We moeten informatie combineren van twee catalogi, sys.tables
en sys.columns
, dus we gebruiken een JOIN
uitspraak. De twee zijn verbonden door de object_id
veld, dus we JOIN
op dat veld.
Van daaruit is het een kwestie van het selecteren van de ColumnName
en TableName
van onze resultaten, en tot slot natuurlijk alleen records opzoeken waar sys.columns.name
is gelijk aan onze ColumnName
tekenreeks.
Deze zoekopdracht vindt echter alleen exacte overeenkomsten van de kolomnaam. Als we gedeeltelijke overeenkomsten willen vinden, kunnen we LIKE
. gebruiken en %
in plaats daarvan jokertekens:
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%'
Daar hebben we het! Een eenvoudige zoekopdracht om alle tabellen en bijbehorende kolommen op te zoeken met een bepaalde (of vergelijkbare) kolomnaam erin.