sql >> Databasteknik >  >> RDS >> Sqlserver

Hitta refererade enheter i SQL Server:sys.dm_sql_referenced_entities

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 deras is_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 visar 0 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 (varav sys.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ån sys.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.


  1. Varför kommer NULL-värden först när man beställer DESC i en PostgreSQL-fråga?

  2. MariaDB INTERSECT Operatör förklaras

  3. Konvertera månadsnummer till månadsnamn i PostgreSQL

  4. Använda ett alias i SQL-beräkningar