sys.sql_expression_dependencies (Transact-SQL)

適用於:SQL Server Azure SQL 受控執行個體 Microsoft Fabric 中 Microsoft Fabric倉儲中的Azure Synapse AnalyticsAnalytics Platform System (PDW)SQL 分析端點

針對目前資料庫中使用者定義實體的每個依名稱相依性,各包含一個數據列。 這包括原生編譯、純量使用者定義函式和其他 SQL Server 模組之間的相依性。 當一個稱為 參考實體的實體出現在另一個實體的保存 SQL 運算式中,稱為 參考實體時,就會建立兩個實體之間的相依性。 例如,在檢視定義中參考數據表時,檢視會以參考實體的身分,相依於數據表、參考的實體。 如果卸除數據表,則檢視無法使用。

如需詳細資訊,請參閱記憶體內部 OLTP 的純量使用者定義函數

您可以使用此目錄檢視來報告下列實體的相依性資訊:

  • 架構系結的實體。

  • 非架構系結實體。

  • 跨資料庫和跨伺服器實體。 報告實體名稱;不過,不會解析實體標識碼。

  • 架構系結實體的數據行層級相依性。 非架構系結對象的數據行層級相依性可以使用sys.dm_sql_referenced_entities傳回

  • 在 master 資料庫的內容中時,伺服器層級 DDL 觸發程式。

資料行名稱 資料類型 描述
referencing_id int 參考實體的標識碼。 不可為 Null。
referencing_minor_id int 參考實體為數據行時的數據行標識元;否則為 0。 不可為 Null。
referencing_class tinyint 參考實體的類別。

1 = 對象或資料行

12 = 資料庫 DDL 觸發程式

13 = 伺服器 DDL 觸發程式

不可為 Null。
referencing_class_desc nvarchar(60) 參考實體類別的描述。

OBJECT_OR_COLUMN

DATABASE_DDL_TRIGGER

SERVER_DDL_TRIGGER

不可為 Null。
is_schema_bound_reference bit 1 = 參考的實體是架構系結。

0 = 參考的實體是非架構系結。

不可為 Null。
referenced_class tinyint 參考實體的類別。

1 = 對象或資料行

6 = 類型

10 = XML 架構集合

21 = 資料分割函數

不可為 Null。
referenced_class_desc nvarchar(60) 參考實體類別的描述。

OBJECT_OR_COLUMN

TYPE

XML_SCHEMA_COLLECTION

PARTITION_FUNCTION

不可為 Null。
referenced_server_name sysname 所參考實體的伺服器名稱。

這個數據行會填入透過指定有效的四部分名稱所建立的跨伺服器相依性。 如需多部分名稱的詳細資訊,請參閱 Transact-SQL 語法慣例

未指定四部分名稱之非架構系結實體的 NULL。

架構系結實體的 NULL,因為它們必須位於相同的資料庫中,因此只能使用兩部分 (schema.object) 名稱來定義。
referenced_database_name sysname 所參考實體的資料庫名稱。

這個數據行會填入跨資料庫或跨伺服器參考,這些參考是藉由指定有效的三部分或四部分名稱所建立。

使用一部分或兩部分名稱指定時,非架構系結參考的NULL。

架構系結實體的 NULL,因為它們必須位於相同的資料庫中,因此只能使用兩部分 (schema.object) 名稱來定義。
referenced_schema_name sysname 參考實體所屬的架構。

在未指定架構名稱的情況下參考實體的非架構系結參考 NULL。

永遠不要為架構系結參考 NULL,因為必須使用兩部分名稱來定義和參考架構系結實體。
referenced_entity_name sysname 參考實體的名稱。 不可為 Null。
referenced_id int 參考實體的標識碼。 這個數據行的值絕不是NULL架構系結參考。 此數據行的值一律為 NULL,適用於跨伺服器和跨資料庫參考。

如果無法判斷標識碼,則為資料庫中的參考NULL。 針對非架構系結參考,在下列情況下無法解析標識符:

參考的實體不存在於資料庫中。

參考實體的架構取決於呼叫者的架構,並在運行時間解析。 在此情況下,is_caller_dependent設定為 1。
referenced_minor_id int 當參考實體為數據行時,參考數據行的標識符;否則為 0。 不可為 Null。

當參考實體中以名稱識別數據行,或當 SELECT * 語句中使用父實體時,參考實體就是數據行。
is_caller_dependent bit 指出參考實體的架構系結發生在運行時間;因此,實體標識碼的解析取決於呼叫者的架構。 當參考的實體是預存程式、擴充預存程式,或 EXECUTE 語句中呼叫的非架構系結使用者定義函數時,就會發生這種情況。

1 = 參考的實體相依於呼叫端,並在運行時間解析。 在此情況下,referenced_id為 NULL。

0 = 參考的實體識別碼與呼叫端無關。

針對架構系結參考,以及明確指定架構名稱的跨資料庫和跨伺服器參考,一律為 0。 例如,格式 EXEC MyDatabase.MySchema.MyProc 實體的參考不是呼叫端相依。 不過,格式 EXEC MyDatabase..MyProc 的參考是呼叫端相依的。
is_ambiguous bit 表示參考模棱兩可,而且可以在運行時間解析為使用者定義函數、用戶定義型別 (UDT),或 xml 類型的 xquery 參考。

例如,假設語句 SELECT Sales.GetOrder() FROM Sales.MySales 是在預存程式中定義。 在執行預存程式之前,不知道 是Sales.GetOrder()名為 之方法之架構或Sales類型 UDT GetOrder()資料行中的Sales使用者定義函式。

1 = 參考模棱兩可。

0 = 參考明確,或呼叫檢視時可以成功系結實體。

架構系結參考一律為 0。

備註

下表列出建立和維護相依性資訊的實體類型。 不會針對規則、預設值、臨時表、暫存程式或系統物件建立或維護相依性資訊。

注意

Azure Synapse Analytics 和平行數據倉儲支援此列表中的數據表、檢視、篩選統計數據和 Transact-SQL 預存程式實體類型。 僅針對數據表、檢視和篩選統計數據建立和維護相依性資訊。

實體類型 參考實體 參考的實體
Table 是* Yes
檢視表​​ Yes Yes
已篩選的索引 是** No
篩選的統計資料 是** No
Transact-SQL 預存程式*** Yes Yes
CLR 預存程式 No Yes
Transact-SQL 用戶定義函數 Yes Yes
CLR 使用者定義函數 No Yes
CLR 觸發程式 (DML 和 DDL) No No
Transact-SQL DML 觸發程式 No
Transact-SQL 資料庫層級 DDL 觸發程式 No
Transact-SQL 伺服器層級 DDL 觸發程式 No
擴充預存程序 No Yes
Queue No Yes
同義字 No Yes
類型 (別名和 CLR 使用者定義類型) No Yes
XML 結構描述集合 No Yes
分割區函數 No Yes

* 只有在數據表參考計算數據行、CHECK 條件約束或 DEFAULT 條件約束的定義中參考 Transact-SQL 模組、使用者定義型別或 XML 架構集合時,才會將數據表追蹤為參考實體。

** 篩選述詞中使用的每個數據行都會追蹤為參考實體。

具有大於 1 之整數值的編號預存程式不會追蹤為參考或參考實體。

權限

需要資料庫的 VIEW DEFINITION 權限和資料庫之 sys.sql_expression_dependencies 的 SELECT 權限。 依預設,SELECT 權限只授與 db_owner 固定資料庫角色的成員。 當 SELECT 和 VIEW DEFINITION 權限授與其他使用者時,被授與者就可以檢視資料庫中的所有相依性。

範例

A. 傳回另一個實體所參考的實體

下列範例會傳回檢視 Production.vProductAndDescription中所參考的數據表和數據行。 檢視取決於 和 referenced_column_name 數據行中傳回的referenced_entity_name實體(數據表和數據行)。

USE AdventureWorks2022;  
GO  
SELECT OBJECT_NAME(referencing_id) AS referencing_entity_name,   
    o.type_desc AS referencing_description,   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,   
    referencing_class_desc,  
    referenced_server_name, referenced_database_name, referenced_schema_name,  
    referenced_entity_name,   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,  
    is_caller_dependent, is_ambiguous  
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referencing_id = OBJECT_ID(N'Production.vProductAndDescription');  
GO  
  

B. 傳回參考另一個實體的實體

下列範例會傳回參考數據表 Production.Product的實體。 數據行中傳回的 referencing_entity_name 實體取決於 Product 數據表。

USE AdventureWorks2022;  
GO  
SELECT OBJECT_SCHEMA_NAME ( referencing_id ) AS referencing_schema_name,  
    OBJECT_NAME(referencing_id) AS referencing_entity_name,   
    o.type_desc AS referencing_description,   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS referencing_minor_id,   
    referencing_class_desc, referenced_class_desc,  
    referenced_server_name, referenced_database_name, referenced_schema_name,  
    referenced_entity_name,   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS referenced_column_name,  
    is_caller_dependent, is_ambiguous  
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N'Production.Product');  
GO  
  

C. 傳回跨資料庫相依性

下列範例會傳回所有跨資料庫相依性。 此範例會先建立資料庫 db1 和兩個預存程式,以參考 資料庫 db2db3中的數據表。 sys.sql_expression_dependencies接著會查詢數據表,以報告程式與數據表之間的跨資料庫相依性。 請注意,NULL 會在參考實體t3的數據行中referenced_schema_name傳回,因為程式定義中未指定該實體的架構名稱。

CREATE DATABASE db1;  
GO  
USE db1;  
GO  
CREATE PROCEDURE p1 AS SELECT * FROM db2.s1.t1;  
GO  
CREATE PROCEDURE p2 AS  
    UPDATE db3..t3  
    SET c1 = c1 + 1;  
GO  
SELECT OBJECT_NAME (referencing_id),referenced_database_name,   
    referenced_schema_name, referenced_entity_name  
FROM sys.sql_expression_dependencies  
WHERE referenced_database_name IS NOT NULL;  
GO  
USE master;  
GO  
DROP DATABASE db1;  
GO  
  

另請參閱

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