sys.sql_expression_dependencies (Transact-SQL)

适用于:SQL ServerAzure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

当前数据库中用户定义实体的每个按名称依赖项在此表中均占一行。 这包括本机编译的标量用户定义函数与其他 SQL Server 模块之间的依赖关系。 当一个称为“被引用的实体”的实体按名称显示在另一个称为“引用实体”的实体的持久化 SQL 表达式中时,将创建这两个实体之间的依赖关系。 例如,在视图定义中引用表时,作为引用实体的视图将依赖于表这个被引用的实体。 如果删除该表,则该视图不可用。

有关详细信息,请参阅内存中 OLTP 的标量用户定义函数

您可以使用此目录视图来报告以下实体的依赖关系信息:

  • 绑定到架构的实体。

  • 非绑定到架构的实体。

  • 跨数据库和跨服务器的实体。 报告了实体名称;但实体 ID 尚未解析。

  • 绑定到架构的实体的列级依赖关系。 可以使用 sys.dm_sql_referenced_entities 返回非绑定到架构的对象的列级依赖关系。

  • 服务器级别的 DDL 触发器(在 master 数据库的上下文中时)。

列名称 数据类型 说明
referencing_id int 引用实体的 ID。 不可为 null。
referencing_minor_id int 引用实体为列时的列 ID;否则为 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 被引用的实体的 ID。 对于绑定到架构的引用,此列的值永远不会为 NULL。 对于跨服务器和跨数据库引用,此列的值永远不会为 NULL。

对于数据库内的引用,如果无法确定 ID,则为 NULL。 对于非绑定到架构的引用,在以下情况下将无法解析 ID:

被引用实体不存在于数据库中。

被引用的实体的架构依赖于调用方的架构,并在运行时解析。 在这种情况下,is_caller_dependent 设置为 1。
referenced_minor_id int 引用实体为列时被引用的列的 ID;否则为 0。 不可为 null。

当列在引用实体中按名称标识时,或者当 SELECT * 语句中使用了父实体时,被引用的实体为列。
is_caller_dependent bit 指示被引用的实体的架构绑定在运行时发生,因此,实体 ID 的解析依赖于调用方的架构。 当被引用的实体为存储过程、扩展存储过程或在 EXECUTE 语句中调用的非绑定到架构的用户定义函数时,将会出现这种情况。

1 = 被引用的实体依赖于调用方并在运行时解析。 在这种情况下,referenced_id 为 NULL。

0 = 被引用的实体 ID 不依赖调用方。

对于绑定到架构的引用、显式指定架构名称的跨数据库和跨服务器的引用,始终为 0。 例如,对格式为 EXEC MyDatabase.MySchema.MyProc 的实体的引用不依赖于调用方。 但是,格式为 EXEC MyDatabase..MyProc 的引用依赖调用方。
is_ambiguous bit 指示引用为不明确引用,并可以在运行时解析为用户定义函数、用户定义类型 (UDT) 或者对 xml 类型的列的 xquery 引用。

例如,假定语句 SELECT Sales.GetOrder() FROM Sales.MySales 是在存储过程中定义的。 在执行存储过程之前,并不知道 Sales.GetOrder()Sales 架构中的用户定义函数还是带有名为 Sales 的方法、类型为 UDT 且名为 GetOrder() 的列。

1 = 引用不明确。

0 = 引用是明确的,或者在调用视图时可以成功绑定实体。

对于绑定到架构的引用始终为 0。

备注

下表列出了为其创建和维护依赖关系信息的实体类型。 不为规则、默认值、临时表、临时存储过程或系统对象创建或维护依赖关系信息。

注意

Azure Synapse Analytics 和并行数据仓库支持此列表中的表、视图、筛选统计信息和 Transact-SQL 存储过程实体类型。 仅针对表、视图和筛选统计信息创建和维护依赖关系信息。

实体类型 引用实体 被引用的实体
是*
查看​
筛选索引 是**
筛选统计信息 是**
Transact-SQL 存储过程***
CLR 存储过程
Transact-SQL 用户定义函数
CLR 用户定义函数
CLR 触发器(DML 和 DDL)
Transact-SQL DML 触发器
Transact-SQL 数据库级 DDL 触发器
Transact-SQL 服务器级 DDL 触发器
扩展的存储过程
队列
同义词
类型(别名和 CLR 用户定义类型)
XML 架构集合
分区函数

* 仅当表在计算列定义、CHECK 约束或 DEFAULT 约束中引用 Transact-SQL 模块、用户定义类型或 XML 架构集合时,才会将该表作为引用实体进行跟踪。

** 筛选谓词中使用的每列都作为引用实体进行跟踪。

*** 整数值大于 1 的带编号的存储过程将不会作为引用实体或被引用的实体进行跟踪。

权限

要求对数据库具有 VIEW DEFINITION 权限,并对数据库的 sys.sql_expression_dependencies 具有 SELECT 权限。 默认情况下,SELECT 权限仅授予 db_owner 固定数据库角色的成员。 将 SELECT 和 VIEW DEFINITION 权限授予其他用户时,被授权者可以查看数据库中的所有依赖关系。

示例

A. 返回另一实体引用的实体

下例返回在 Production.vProductAndDescription 视图中引用的表和列。 该视图依赖于 referenced_entity_namereferenced_column_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 表进行查询,以报告这两个过程和表之间的跨数据库依赖关系。 请注意,在被引用实体 referenced_schema_namet3 列中返回 NULL,原因是过程定义中没有为该实体指定架构名称。

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)