I SQL Server kan du använda sys.dm_sql_referenced_entities()
systemdynamisk hanteringsfunktion för att få en lista över alla användardefinierade entiteter som refereras till med namn, i definitionen av en given entitet.
Med andra ord returnerar den en lista över alla användardefinierade enheter som en specifik enhet är beroende av.
Specifikt rapporterar den om följande enhetstyper som refereras till av den angivna referensenheten:
- Schemabundna enheter
- Icke-schemabundna enheter
- Entiteter över databaser och servrar
- Broen på kolumnnivå av schemabundna och icke-schemabundna enheter
- Användardefinierade typer (alias och CLR UDT)
- XML-schemasamlingar
- Partitionsfunktioner
Syntax
Syntaxen ser ut så här:
sys.dm_sql_referenced_entities ( ' [ schema_name. ] referencing_entity_name ' , '' ) ::={ OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Exempel 1 – Grundläggande exempel
Här är ett exempel på användning:
USE Test;SELECT refered_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.usp> ');Resultat:
+----------+-------------+------------+-------- ----------+----------------+---------------------- --+| Schema | Entitet | Mindre | Klass | är_välj_alla | är_alla_kolumner_hittade ||----------+------------+------------+---------- --------+-----------------+----------------------- -|| dbo | Kund | NULL | OBJECT_OR_COLUMN | 1 | 1 || dbo | Kund | Klientkod | OBJECT_OR_COLUMN | 1 | 1 || dbo | Kund | Förnamn | OBJECT_OR_COLUMN | 1 | 1 || dbo | Kund | Efternamn | OBJECT_OR_COLUMN | 1 | 1 || NULL | kundkod | NULL | TYP | 0 | 0 |+-----------+----------------------- --------+-----------------+----------------------- -+Här får jag alla entiteter som refereras till i
dbo.uspGetClient
lagrad procedur. I det här fallet finns det fem enheter.Den första är tabellen som heter "Client". De nästa tre är alla kolumner i den tabellen. Den sista är en användardefinierad aliasdatatyp som kallas "klientkod".
Vi kan också se att de fyra första används i en select-sats som använder asterisken (
*
) jokertecken för att välja alla kolumner (eftersom derasis_select_all
). är inställd på1
).Här är den faktiska definitionen som används för att skapa den lagrade proceduren som vi analyserar:
SKAPA PROCEDUR [dbo].[uspGetClient] @ClientCode klientkod ASSELECT * FRÅN [dbo].[Client]WHERE ClientCode =@ClientCode;Ja, det är en mycket enkel lagrad procedur, men den är idealisk för våra syften. Vi kan se alla refererade enheter som returneras av
sys.dm_sql_referenced_entities()
.Vi kan också se att proceduren består av en enda
SELECT
fråga som använder asterisken jokertecken för att markera alla kolumner.Exempel 2 – Ta bort "Välj alla" (
*
)Låt oss ändra den lagrade proceduren så att den inte använder asteriskens jokertecken för att välja alla kolumner.
ÄNDRA PROCEDUR [dbo].[uspGetClient] @ClientCode klientkod ASSELECT FirstName, LastNameFROM [dbo].[Client]WHERE ClientCode =@ClientCode;Så det returnerar nu uttryckligen kolumnerna "FirstName" och "LastName". Inga jokertecken hittades.
Kör nu
sys.dm_sql_referenced_entities()
igen:USE Test;SELECT refered_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.usp> ');Resultat:
+----------+-------------+------------+-------- ----------+----------------+---------------------- --+| Schema | Entitet | Mindre | Klass | är_välj_alla | är_alla_kolumner_hittade ||----------+------------+------------+---------- --------+-----------------+----------------------- -|| dbo | Kund | NULL | OBJECT_OR_COLUMN | 0 | 1 || dbo | Kund | Klientkod | OBJECT_OR_COLUMN | 0 | 1 || dbo | Kund | Förnamn | OBJECT_OR_COLUMN | 0 | 1 || dbo | Kund | Efternamn | OBJECT_OR_COLUMN | 0 | 1 || NULL | kundkod | NULL | TYP | 0 | 0 |+-----------+----------------------- --------+-----------------+----------------------- -+Den här gången är
is_select_all
kolumnen visar0
på alla rader.Exempel 3 – Referera till en icke-existerande enhet
Vad händer om din enhet refererar till en obefintlig enhet?
Till exempel, vad händer om din kollega släpper en kolumn som faktiskt refereras av en lagrad procedur och sedan kör
sys.dm_sql_referenced_entities()
mot den lagrade proceduren?Låt oss ta reda på det.
ÄNDRA TABELL [dbo].[Klient] SLIPP KOLUMN Efternamn;Jag tappade precis
LastName
kolumn från mitt bord.Kör nu
sys.dm_sql_referenced_entities()
igen:SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient');, 'GetClient');Resultat:
Msg 207, Level 16, State 1, Procedure uspGetClient, Rad 4Ogiltigt kolumnnamn 'LastName'. Meddelande 2020, Level 16, State 1, Rad 3. Beroendena som rapporterats för entiteten "dbo.uspGetClient" innehåller kanske inte referenser till alla kolumner . Detta beror antingen på att entiteten refererar till ett objekt som inte finns eller på grund av ett fel i en eller flera satser i entiteten. Innan du kör frågan igen, se till att det inte finns några fel i entiteten och att alla objekt som entiteten refererar till finns.Exempel 4 – Släpp hela tabellen
Låt oss ta reda på vad som händer om vi släpper hela tabellen.
DROP TABLE Client;Tabellen har tagits bort.
Kör
sys.dm_sql_referenced_entities()
:SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dbo.uspGetClient');, 'GetClient');Resultat:
Msg 2020, Level 16, State 1, Rad 2De beroenden som rapporterats för entiteten "dbo.uspGetClient" kanske inte inkluderar referenser till alla kolumner. Detta beror antingen på att entiteten refererar till ett objekt som inte finns eller på grund av ett fel i en eller flera satser i entiteten. Innan du kör frågan igen, se till att det inte finns några fel i entiteten och att alla objekt som entiteten refererar till finns.Exempel 5 – Returnera alla kolumner
Microsoft rekommenderar specifikt att du inte använder asterisken (
*
) för att välja alla kolumner från dynamiska hanteringsvyer och funktioner (varavsys.dm_sql_referenced_entities()
är en). Detta beror på att deras scheman och data de returnerar kan komma att ändras i framtida versioner av SQL Server. Detta kan resultera i att kolumner läggs till i slutet av kolumnlistan i framtida versioner, vilket kan förstöra din applikation om du litar på asterisken för att välja alla kolumner.Som sagt, här är ett exempel som gör just det:använder asterisken (
*
) för att välja alla kolumner frånsys.dm_sql_referenced_entities()
. Jag gör bara detta för att visa dig vilka kolumner som faktiskt returneras från den här funktionen (åtminstone i SQL Server 2019).VÄLJ *FRÅN sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');Resultat (med vertikal utdata):
-[ RECORD 1 ]------------------------referencing_minor_id | 0referens_servernamn | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | NULLreferenced_id | 434100587referenced_minor_id | 0referensklass | 1referenced_class_desc | OBJECT_OR_COLUMNär_samtalsberoende | 0är_tvetydig | 0is_selected | 1is_updated | 0is_select_all | 0finns_alla_kolumner | 1is_insert_all | 0is_incomplete | 0-[ RECORD 2 ]------------------------referencing_minor_id | 0referens_servernamn | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | ClientCodereferenced_id | 434100587referenced_minor_id | 1referens_klass | 1referenced_class_desc | OBJECT_OR_COLUMNär_samtalsberoende | 0is_ambiguous | 0is_selected | 1is_updated | 0is_select_all | 0finns_alla_kolumner | 1is_insert_all | 0is_incomplete | 0-[ RECORD 3 ]------------------------referencing_minor_id | 0referens_servernamn | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | FirstNamereferenced_id | 434100587referenced_minor_id | 2referens_klass | 1referenced_class_desc | OBJECT_OR_COLUMNär_samtalsberoende | 0is_ambiguous | 0is_selected | 1is_updated | 0is_select_all | 0finns_alla_kolumner | 1is_insert_all | 0is_incomplete | 0-[ RECORD 4 ]------------------------referencing_minor_id | 0referens_servernamn | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | LastNamereferenced_id | 434100587referenced_minor_id | 3referens_klass | 1referenced_class_desc | OBJECT_OR_COLUMNär_samtalsberoende | 0is_ambiguous | 0is_selected | 1is_updated | 0is_select_all | 0finns_alla_kolumner | 1is_insert_all | 0is_incomplete | 0-[ RECORD 5 ]--------------------------------referencing_minor_id | 0referens_servernamn | NULLreferenced_database_name | NULLreferenced_schema_name | NULLreferenced_entity_name | clientcodereferenced_minor_name | NULLreferenced_id | 257referenced_minor_id | 0referensklass | 6referenced_class_desc | TYPEär_samtalsberoende | 0is_ambiguous | 0is_selected | 0is_updated | 0is_select_all | 0finns_alla_kolumner | 0is_insert_all | 0is_incomplete | 0(5 rader påverkade)Officiell dokumentation
För mer detaljerad information och exempel, se
sys.dm_sql_referenced_entities
på Microsofts webbplats.