En af de gode ting ved databasevisninger er, at de giver dig mulighed for at køre komplekse forespørgsler uden at skulle kende det underliggende databaseskema.
Ja, det er rigtigt, at du skal kende det underliggende skema, når du opretter visningen, men du behøver kun at gøre det én gang. Når du har oprettet den, kan du forespørge på den visning hele dagen lang uden at skulle huske alle tabel- og kolonnenavne osv.
Visninger kombinerer typisk data fra flere tabeller til en enkelt virtuel tabel, hvilket gør det lidt som en "sort boks". Så længe det fungerer som designet, behøver du ikke bekymre dig om de skjulte detaljer.
Men hvad hvis du gør vil du kontrollere en visning for dens underliggende tabeller og kolonner?
Mens sp_help
Den systemlagrede procedure vil give dig information om de kolonner, der returneres af visningen, den giver ikke information om kolonnerne i basistabellerne, der refereres til i visningen.
Og ja, der er mange måder at kontrollere den faktiske definition af udsigten på. Men hvis det er en stor visning, risikerer du at gå på kryds og tværs, bare prøve at udvælge alle de faktiske involverede basistabeller.
Der er dog en anden metode, du kan bruge til at returnere basistabellerne og kolonnerne, der bruges af en visning.
Du kan bruge sys.dm_exec_describe_first_result_set
system dynamisk administrationsfunktion til at returnere metadata om resultatsættet, når du forespørger i visningen.
Måden det fungerer på er, at du sender en T-SQL-forespørgsel til funktionen, og den returnerer metadata om resultatsættet. I dette tilfælde vil den forespørgsel, du sender til funktionen, være den forespørgsel, du ville bruge, når du forespørger i visningen.
En fordel ved at bruge denne metode er, at du får basistabellen og kolonneoplysningerne i en flot liste. Hver kolonne er angivet i en separat række.
Du kan også indsnævre resultaterne ved at forfine din forespørgsel, hvilket betyder, at du kan fjerne alle irrelevante kolonner (dvs. kolonner, der er i visningen, men ikke er relevante for din specifikke forespørgsel).
Eksempel
Her er et eksempel for at vise, hvordan det virker.
SELECT
CONCAT(
source_server + '.',
source_database + '.',
source_schema + '.',
source_table + '.',
source_column) AS [Source Column],
name AS [View Column],
user_type_name,
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
N'SELECT * FROM vAllCats',
NULL,
1
);
Resultat:
+------------------------+------------------ --------------+---------------------+--------------+- ------------+---------+| Kildekolonne | Se kolonne | bruger_type_navn | system_type_name | max_længde | præcision | skala ||------------------------+------------------- -----------------------------+-------------- ----------+---------|| Test.dbo.Cats.CatId | CatId | NULL | int | 4 | 10 | 0 || Test.dbo.Cats.CatName | Kattenavn | NULL | varchar(60) | 60 | 0 | 0 |+------------------------+----------------- -----------------------------+-------------- ----------+---------+
Her har jeg besluttet at bruge CONCAT()
funktion til at sammenkæde flere kolonnenavne for at gøre det nemmere at visualisere skemaet.
I dette tilfælde deler kildekolonnen og visningskolonnen" (dvs. kolonnen returneret af visningen) begge det samme navn. Dette vil ske, hvis visningen ikke bruger et alias for kolonnen.
Bemærk, at grunden til, at vi er i stand til at få kildekolonner, tabeller osv., er fordi vi bruger 1
som det tredje argument. Når vi bruger denne værdi, analyseres hver forespørgsel, som om den har en FOR BROWSE
mulighed på forespørgslen.
Når visningen bruger kolonnealiaser
Hvis visningen bruger kolonnealiasser, der er forskellige fra de faktiske underliggende kolonnenavne, vil det afspejle vores resultater.
I dette eksempel forespørger vi en visning, der bruger kolonnealiaser.
SELECT
CONCAT(
source_server + '.',
source_database + '.',
source_schema + '.',
source_table + '.',
source_column) AS [Source Column],
name AS [View Column],
user_type_name,
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
N'SELECT * FROM vAlbums',
NULL,
1
);
Resultat:
+--------------------------------------------+-------- ------+-------------------+--------------------+--- -----------+-------------+---------+| Kildekolonne | Se kolonne | bruger_type_navn | system_type_name | max_længde | præcision | skala ||----------------------------------------+---------------- -----+-------------------+--------------------+---- ----------+-------------+---------|| Homer.Music.dbo.Artists.ArtistName | Kunstner | NULL | nvarchar(255) | 510 | 0 | 0 || Homer.Music.dbo.Albums.AlbumName | Album | NULL | nvarchar(255) | 510 | 0 | 0 || Homer.Music.dbo.Genres.Genre | Genre | NULL | nvarchar(50) | 100 | 0 | 0 || Homer.Music.dbo.Artists.ArtistId | ArtistId | NULL | int | 4 | 10 | 0 || Homer.Music.dbo.Albums.AlbumId | AlbumId | NULL | int | 4 | 10 | 0 || Homer.Music.dbo.Genres.GenreId | GenreId | NULL | int | 4 | 10 | 0 |+--------------------------------------------+----------- -----+-------------------+--------------------+---- ----------+-------------+---------+
Hvis vi ser på de to første rækker, kan vi se, at de underliggende kolonner (returneret af source_column
kolonner), er forskellige fra "Vis kolonne" (returneret af name
). kolonne).
Vi kan også se, at kildekolonnerne for denne visning er placeret på en forbundet server kaldet "Homer".
En anden ting at bemærke er, at når du bruger browsertilstand, som vi er her (dvs. med 1
som det tredje argument) får vi også andre kolonner, der er involveret i at fuldføre forespørgslen (ArtistId
, AlbumId
og GenreId
), selvom de faktisk ikke returneres i resultatsættet.
Juster forespørgslen
En af de ting, der adskiller sys.dm_exec_describe_first_result_set
fra procedurer som sp_help
og sp_helptext
, er, at den beskriver resultatsættet ikke udsigten.
De resultater, du får, afhænger af den faktiske forespørgsel, du sender, ikke kun visningen.
Her er den samme forespørgsel som i det forrige eksempel, bortset fra at denne gang vælger jeg kun én kolonne fra visningen (i stedet for at bruge *
jokertegn for at vælge alle kolonner).
SELECT
CONCAT(
source_server + '.',
source_database + '.',
source_schema + '.',
source_table + '.',
source_column) AS [Source Column],
name AS [View Column],
user_type_name,
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
N'SELECT Album FROM vAlbums',
NULL,
1
);
Resultat:
+-----------------------------------+---------------- ----+-------------------+---------------------+----- ----------+-------------+---------+| Kildekolonne | Se kolonne | bruger_type_navn | system_type_name | max_længde | præcision | skala ||----------------------------------------+---------------- ---+-------------------+--------------------+------ ----+-------------+---------|| Homer.Music.dbo.Albums.AlbumName | Album | NULL | nvarchar(255) | 510 | 0 | 0 || Homer.Music.dbo.Artists.ArtistId | ArtistId | NULL | int | 4 | 10 | 0 || Homer.Music.dbo.Albums.AlbumId | AlbumId | NULL | int | 4 | 10 | 0 || Homer.Music.dbo.Genres.GenreId | GenreId | NULL | int | 4 | 10 | 0 |+------------------------------------+------------ ---+-------------------+--------------------+------ ----+-------------+---------+
Så denne gang returneres kun få fire rækker i stedet for seks.
Få de underliggende kolonner fra flere visninger
Som nævnt er sys.dm_exec_describe_first_result_set
funktion beskriver hele resultatsættet, ikke kun en enkelt visning eller andet objekt.
Derfor kan du opdage de underliggende kolonner fra flere visninger og objekter på én gang.
Eksempel:
SELECT
CONCAT(
source_server + '.',
source_database + '.',
source_schema + '.',
source_table + '.',
source_column) AS [Source Column],
name AS [View Column],
user_type_name,
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
N'SELECT * FROM vAllCats c INNER JOIN vAllDogs d ON c.CatName = d.DogName',
NULL,
1
);
Resultat:
+------------------------+------------------ --------------+---------------------+--------------+- ------------+---------+| Kildekolonne | Se kolonne | bruger_type_navn | system_type_name | max_længde | præcision | skala ||------------------------+------------------- -----------------------------+-------------- ----------+---------|| Test.dbo.Cats.CatId | CatId | NULL | int | 4 | 10 | 0 || Test.dbo.Cats.CatName | Kattenavn | NULL | varchar(60) | 60 | 0 | 0 || Test.dbo.Dogs.DogId | DogId | NULL | int | 4 | 10 | 0 || Test.dbo.Dogs.DogName | Hundenavn | NULL | nvarchar(255) | 510 | 0 | 0 || Test.dbo.Dogs.GoodDog | GoodDog | NULL | lidt | 1 | 1 | 0 |+------------------------+----------------- -----------------------------+-------------- ----------+---------+