Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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:
- Återskapar
Table1, som togs bort i exempel D. - Kör Sedan
sys.dm_sql_referenced_entitieskö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)