sys.dm_sql_referenced_entities (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

Returnerar en rad för varje användardefinierad entitet som refereras med namn i definitionen av den specificerade referensentiteten i SQL Server. Ett beroende mellan två entiteter skapas när en användardefinierad entitet, kallad den refererade entiteten, visas vid namn i ett bestående SQL-uttryck från en annan användardefinierad entitet, kallad referensentiteten. Till exempel, om en lagrad produr är den specificerade referensentiteten, returnerar denna funktion alla användardefinierade entiteter som refereras i den lagrade proceduren, såsom tabeller, vyer, användardefinierade typer (UDT) eller andra lagrade procedurer.

Du kan använda denna dynamiska hanteringsfunktion för att rapportera om följande typer av enheter som refereras till av den angivna referensentiteten:

  • Schemabundna enheter

  • Icke-schemabundna enheter

  • Databasöverskridande och serveröverskridande enheter

  • Kolumnnivåberoenden på schemabundna och icke-schemabundna enheter

  • Användardefinierade typer (alias och CLR UDT)

  • XML-schemasamlingar

  • Partitionsfunktioner

Syntax

sys.dm_sql_referenced_entities (  
    ' [ schema_name. ] referencing_entity_name ' ,
    ' <referencing_class> ' )  
  
<referencing_class> ::=  
{  
    OBJECT  
  | DATABASE_DDL_TRIGGER  
  | SERVER_DDL_TRIGGER  
}  

Arguments

[ schema_name. ] referencing_entity_name
Är namnet på den refererande enheten. schema_name krävs när referensklassen är OBJECT.

schema_name.referencing_entity_name är nvarchar(517).

<referencing_class> ::= { OBJEKT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Är klassen av den specificerade referensentiteten. Endast en klass kan specificeras per sats.

<referencing_class> är nvarchar(60).

Tabell returnerad

Kolumnnamn Datatyp Description
referencing_minor_id int Kolumn-ID när den refererande enheten är en kolumn; annars 0. Får inte vara ogiltig.
referenced_server_name sysname Namnet på servern för den refererade enheten.

Denna kolumn fylls för serveröverskridande beroenden som skapas genom att ange ett giltigt fyrdelat namn. För information om flerdelade namn, se Transact-SQL syntaxkonventioner.

NULL för icke-schemabundna beroenden där entiteten refererades utan att specificera ett fyrdelat namn.

NULL för schemabundna enheter eftersom de måste finnas i samma databas och därför endast kan definieras med ett tvådelat (schema.object) namn.
referenced_database_name sysname Namnet på databasen för den refererade enheten.

Denna kolumn fylls med referenser över databaser eller servrar som görs genom att ange ett giltigt namn i tre eller fyra delar.

NULL för icke-schemabundna referenser när de anges med ett endelat eller tvådelat namn.

NULL för schemabundna enheter eftersom de måste finnas i samma databas och därför endast kan definieras med ett tvådelat (schema.object) namn.
referenced_schema_name sysname Schema där den refererade enheten hör hemma.

NULL för icke-schemabundna referenser där entiteten refererades utan att specificera schemanamnet.

Aldrig NULL för schemabundna referenser.
referenced_entity_name sysname Namnet på den refererade enheten. Får inte vara ogiltig.
referenced_minor_name sysname Kolumnnamn när den refererade enheten är en kolumn; annars NULL. Till exempel är referenced_minor_name NULL i raden som listar den refererade entiteten själv.

En refererad entitet är en kolumn när en kolumn identifieras med namn i den refererande entiteten, eller när moderentiteten används i en SELECT *-sats.
referenced_id int ID för den refererade enheten. När referenced_minor_id inte är 0 är referenced_id den entitet där kolumnen är definierad.

Alltid NULL för korsserverreferenser.

NULL för korsdatabasreferenser när ID:t inte kan bestämmas eftersom databasen är offline eller enheten inte kan bindas.

NULL för referenser inom databasen om ID:t inte kan bestämmas. För icke-schemabundna referenser kan ID:t inte lösas när den refererade enheten inte finns i databasen eller när namnupplösningen är beroende av anroparen. I det senare fallet sätts is_caller_dependent till 1.

Aldrig NULL för schemabundna referenser.
referenced_minor_id int Kolumn-ID när den refererade enheten är en kolumn; annars 0. Till exempel är referenced_minor_is 0 i raden som listar den refererade entiteten.

För icke-schemabundna referenser rapporteras kolumnberoenden endast när alla refererade entiteter kan bindas. Om någon refererad entitet inte kan bindas rapporteras inga kolumnnivåberoenden och referenced_minor_id är 0. Se exempel D.
referenced_class tinyint Klass för den refererade entiteten.

1 = Objekt eller kolumn

6 = Typ

10 = XML-schemasamling

21 = Partitionsfunktion
referenced_class_desc nvarchar(60) Beskrivning av klass av refererad entitet.

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION
is_caller_dependent bit Indikerar att schemabindning för den refererade enheten sker vid körning; därför beror upplösningen av entitets-ID:t på anroparens schema. Detta sker när den refererade enheten är en lagrad procedur, utökad lagrad procedur eller en användardefinierad funktion som anropas inom ett EXECUT-uttalande.

1 = Den refererade enheten är anroparberoende och löses vid körning. I detta fall är referenced_id NULL.

0 = Det refererade entitets-ID:t är inte beroende av anroparen. Alltid 0 för schemabundna referenser och för korsdatabas- och serverreferenser som uttryckligen specificerar ett schemanamn. Till exempel är en referens till en entitet i formatet EXEC MyDatabase.MySchema.MyProc inte anroparberoende. Dock är en referens i formatet EXEC MyDatabase..MyProc beroende av anroparen.
is_ambiguous bit Indikerar att referensen är tvetydig och kan lösas vid körning till en användardefinierad funktion, en användardefinierad typ (UDT) eller en xquery-referens till en kolumn av typen xml. Till exempel, anta att satsen SELECT Sales.GetOrder() FROM Sales.MySales definieras i en lagrad procedur. Tills den lagrade proceduren körs är det inte känt om Sales.GetOrder() är en användardefinierad funktion i schemat Sales eller kolumnen med typen Sales UDT och en metod som heter GetOrder().

1 = Referens till en användardefinierad funktion eller kolumn användardefinierad typ (UDT) är tvetydig.

0 = Referensen är entydig eller så kan entiteten framgångsrikt bindas när funktionen anropas.

Alltid 0 för schemabundna referenser.
is_selected bit 1 = Objektet eller kolumnen väljs.
is_updated bit 1 = Objektet eller kolumnen modifieras.
is_select_all bit 1 = Objektet används i en SELECT*-klausul (endast objektnivå).
is_all_columns_found bit 1 = Alla kolumnberoenden för objektet kunde hittas.

0 = Kolumnberoenden för objektet kunde inte hittas.
is_insert_all bit 1 = Objektet används i en INSERT-sats utan kolumnlista (endast objektnivå).

Denna kolumn lades till i SQL Server 2016.
is_incomplete bit 1 = Objektet eller kolumnen har ett bindningsfel och är ofullständig.

Denna kolumn lades till i SQL Server 2016 SP2.

Exceptions

Returnerar en tom resultatmängd under något av följande villkor:

  • Ett systemobjekt specificeras.

  • Den angivna enheten finns inte i den aktuella databasen.

  • Den angivna enheten refererar inte till några enheter.

  • En ogiltig parameter passeras.

Returnerar ett fel när den angivna referensenheten är en numrerad lagrad procedur.

Returnerar fel 2020 när kolumnberoenden inte kan lösas. Detta fel hindrar inte frågan från att returnera objektnivåberoenden.

Anmärkningar

Denna funktion kan utföras i kontexten av vilken databas som helst för att returnera de enheter som refererar till en servernivå-DDL-trigger.

Följande tabell listar de typer av enheter för vilka beroendeinformation skapas och underhålls. Beroendeinformation skapas eller underhålls inte för regler, standardvärden, temporära tabeller, tillfälligt lagrade procedurer eller systemobjekt.

Entitetstyp Referensentitet Refererad enhet
Tabell Ja* Yes
View Yes Yes
Transact-SQL lagrad procedur** Yes Yes
CLR-lagrad procedur Nej Yes
Transact-SQL användardefinierad funktion Yes Yes
CLR:s användardefinierade funktion Nej Yes
CLR-trigger (DML och DDL) Nej Nej
Transact-SQL DML-utlösare Yes Nej
Transact-SQL databasnivå-DDL-trigger Yes Nej
Transact-SQL servernivå-DDL-trigger Yes Nej
Utökade lagrade procedurer Nej Yes
Queue Nej Yes
Synonym Nej Yes
Type (alias och CLR användardefinierad typ) Nej Yes
XML-schemasamling Nej Yes
Partitionsfunktion Nej Yes

* En tabell spåras som en referensentitet endast när den refererar till en Transact-SQL modul, användardefinierad typ eller XML-schemasamling i definitionen av en beräknad kolumn, CHECK-begränsning eller DEFAULT-begränsning.

** Numrerade lagrade procedurer med ett heltalsvärde större än 1 spåras inte som vare sig referens- eller referensentitet.

Permissions

Kräver SELECT-behörighet på sys.dm_sql_referenced_entities och VIEW DEFINITION-behörighet på den refererande enheten. Som standard ges SELECT-behörighet till allmänheten. Kräver behörighet VIEW DEFINITION på databasen eller ALTER DATABASE DDL TRIGGER-behörighet på databasen när den refererande enheten är en databasnivå DDL-trigger. Kräver behörighet VIEW ANY DEFINITION på servern när den refererande enheten är en servernivå DDL-trigger.

Examples

A. Returnera entiteter som refereras av en databasnivå-DDL-trigger

Följande exempel returnerar de entiteter (tabeller och kolumner) som refereras av databasnivå-DDL-triggern ddlDatabaseTriggerLog.

USE AdventureWorks2022;  
GO  
SELECT
        referenced_schema_name,
        referenced_entity_name,
        referenced_minor_name,
        referenced_minor_id,
        referenced_class_desc
    FROM
        sys.dm_sql_referenced_entities (
            'ddlDatabaseTriggerLog',
            'DATABASE_DDL_TRIGGER')
;
GO  

B. Returnera entiteter som refereras av ett objekt

Följande exempel returnerar de entiteter som refereras av den användardefinierade funktionen dbo.ufnGetContactInformation.

USE AdventureWorks2022;  
GO  
SELECT
        referenced_schema_name,
        referenced_entity_name,
        referenced_minor_name,
        referenced_minor_id,
        referenced_class_desc,
        is_caller_dependent,
        is_ambiguous
    FROM
        sys.dm_sql_referenced_entities (
            'dbo.ufnGetContactInformation',
            'OBJECT')
;
GO  

C. Returkolumnberoenden

Följande exempel skapar tabellen Table1 med den beräknade kolumnen ca definierad som summan av kolumnerna och b. Utsikten sys.dm_sql_referenced_entities kallas då. Vyn returnerar två rader, en för varje kolumn definierad i den beräknade kolumnen.

CREATE TABLE dbo.Table1 (a int, b int, c AS a + b);  
GO  
SELECT
        referenced_schema_name AS schema_name,  
        referenced_entity_name AS table_name,  
        referenced_minor_name  AS referenced_column,  
        COALESCE(
            COL_NAME(OBJECT_ID(N'dbo.Table1'),
            referencing_minor_id),
            'N/A') AS referencing_column_name  
    FROM
        sys.dm_sql_referenced_entities ('dbo.Table1', 'OBJECT')
;
GO

-- Remove the table.  
DROP TABLE dbo.Table1;  
GO  

Här är resultatet.

schema_name table_name referenced_column referencing_column  
----------- ---------- ----------------- ------------------  
dbo         Table1     a                 c  
dbo         Table1     b                 c  

D. Returnera kolumnberoenden som inte är schemabundna

Följande exempel släpper Table1 och skapar Table2 och lagrade procedur Proc1. Procedurreferenserna Table2 och den icke-existerande tabellen Table1. Vyn sys.dm_sql_referenced_entities körs med den lagrade proceduren specificerad som referensentitet. Resultatmängden visar en rad för Table1 och 3 rader för Table2. Eftersom Table1 inte existerar kan kolumnberoendena inte lösas och fel 2020 returneras. Kolumnen is_all_columns_found ger 0 för Table1 att indikera att det fanns kolumner som inte kunde upptäckas.

DROP TABLE IF EXISTS dbo.Table1;
GO  
CREATE TABLE dbo.Table2 (c1 int, c2 int);  
GO  
CREATE PROCEDURE dbo.Proc1 AS  
    SELECT a, b, c FROM Table1;  
    SELECT c1, c2 FROM Table2;  
GO  
SELECT
        referenced_id,
        referenced_entity_name AS table_name,
        referenced_minor_name  AS referenced_column_name,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  

Här är resultatet.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1  
935674381     Table2       C1                      1  
935674381     Table2       C2                      1  
NULL          Table1       NULL                    0  

Msg 2020, Level 16, State 1, Line 1
The dependencies reported for entity "dbo.Proc1" might not include
 references to all columns. This is either because the entity
 references an object that does not exist or because of an error
 in one or more statements in the entity.  Before rerunning the
 query, ensure that there are no errors in the entity and that
 all objects referenced by the entity exist.

E. Demonstration av dynamiskt beroendeunderhåll

Detta exempel E förutsätter att exempel D har körts. Exempel E visar att beroenden upprätthålls dynamiskt. Exemplet gör följande saker:

  1. Återskapar Table1, som togs bort i exempel D.
  2. Kör Sedan sys.dm_sql_referenced_entities körs igen med den lagrade proceduren specificerad som referensentitet.

Resultatmängden visar att både tabellerna och deras respektive kolumner definierade i den lagrade proceduren returneras. Dessutom returnerar kolumnen is_all_columns_found en 1 för alla objekt och kolumner.

CREATE TABLE Table1 (a int, b int, c AS a + b);  
GO   
SELECT
        referenced_id,
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_all_columns_found
    FROM
        sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT');
GO  
DROP TABLE Table1, Table2;  
DROP PROC Proc1;  
GO  

Här är resultatet.

referenced_id table_name   referenced_column_name  is_all_columns_found  
------------- ------------ ----------------------- --------------------  
935674381     Table2       NULL                    1 
935674381     Table2       c1                      1 
935674381     Table2       c2                      1 
967674495     Table1       NULL                    1 
967674495     Table1       a                       1  
967674495     Table1       b                       1  
967674495     Table1       c                       1  

F. Returnerande användning av objekt eller kolumn

Följande exempel returnerar objekt- och kolumnberoendena för den lagrade proceduren HumanResources.uspUpdateEmployeePersonalInfo. Denna promotor uppdaterar NationalIDNumberkolumnerna , BirthDate,``MaritalStatus, och Gender i Employee tabellen baserat på ett angivet BusinessEntityID värde. En annan lagrad procedur definieras upsLogError i en TRY... CATCH-blocket för att fånga eventuella exekveringsfel. Kolumnerna is_selected, is_updated, och is_select_all returnerar information om hur dessa objekt och kolumner används inom referensobjektet. Tabellen och kolumnerna som ändras anges med en 1:a i kolumnen is_updated. Kolumnen BusinessEntityID är endast vald och den lagrade proceduren uspLogError är varken vald eller modifierad.

USE AdventureWorks2022;
GO
SELECT
        referenced_entity_name AS table_name,
        referenced_minor_name  AS column_name,
        is_selected,  is_updated,  is_select_all
    FROM
        sys.dm_sql_referenced_entities(
            'HumanResources.uspUpdateEmployeePersonalInfo',
            'OBJECT')
;

Här är resultatet.

table_name    column_name         is_selected is_updated is_select_all  
------------- ------------------- ----------- ---------- -------------  
uspLogError   NULL                0           0          0  
Employee      NULL                0           1          0  
Employee      BusinessEntityID    1           0          0  
Employee      NationalIDNumber    0           1          0  
Employee      BirthDate           0           1          0  
Employee      MaritalStatus       0           1          0  
Employee      Gender              0           1          0

Se även

sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL)