You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用游标遍历Schema内表并获取表依赖的SQL实现问题

问题解决:遍历指定Schema基表获取依赖关系

问题说明

需实现用游标遍历指定Schema下的所有基表,通过sys.dm_sql_referencing_entities获取每张表的依赖关系,但现有代码存在语法错误及数据覆盖问题。

错误点分析

  1. 对象名拼接未加引号:调用sys.dm_sql_referencing_entities时,第一个参数要求是带单引号的对象名称,原代码直接拼接变量会触发语法错误。
  2. 临时表重复创建覆盖数据:每次循环都删除并重建临时表,最终仅能保留最后一张表的依赖数据,无法收集所有表的结果。

修正后的完整代码

DECLARE @SchemaName nvarchar(MAX)
DECLARE @TableName nvarchar(MAX)
DECLARE @SQL nvarchar(MAX)
SET @SchemaName = 'dbo'

-- 创建临时表存储所有表的依赖结果(避免循环覆盖)
IF OBJECT_ID('tempdb..#AllTableDependencies','U') IS NOT NULL
    DROP TABLE #AllTableDependencies;
CREATE TABLE #AllTableDependencies (
    referencing_schema_name sysname,
    referencing_entity_name sysname,
    referencing_id int,
    referencing_class tinyint,
    referencing_class_desc nvarchar(60),
    is_caller_dependent bit,
    is_ambiguous bit
)

DECLARE TableCursor CURSOR FOR
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA = @SchemaName
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 
        '
        INSERT INTO #AllTableDependencies
        SELECT * FROM sys.dm_sql_referencing_entities(''' + @SchemaName + '.' + @TableName + ''', ''OBJECT'')
        '
    EXEC sp_executesql @SQL
    FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor

-- 返回所有表的依赖结果(列名已汉化)
SELECT 
    referencing_schema_name AS 引用对象架构名,
    referencing_entity_name AS 引用对象名称,
    referencing_id AS 引用对象ID,
    referencing_class AS 引用对象类别,
    referencing_class_desc AS 引用对象类别描述,
    is_caller_dependent AS 是否依赖调用者,
    is_ambiguous AS 是否模糊引用
FROM #AllTableDependencies

单表测试修正代码

针对你已尝试的单表查询,修正语法错误后的代码:

DECLARE @table NVARCHAR(MAX)
DECLARE @SQL nvarchar(MAX)
SET @table = 'dbo.InventTable'
SET @sql = 
    '
    SELECT 
        referencing_schema_name AS 引用对象架构名,
        referencing_entity_name AS 引用对象名称,
        referencing_id AS 引用对象ID,
        referencing_class AS 引用对象类别,
        referencing_class_desc AS 引用对象类别描述,
        is_caller_dependent AS 是否依赖调用者,
        is_ambiguous AS 是否模糊引用
    FROM sys.dm_sql_referencing_entities(''' + @table + ''', ''OBJECT'')
    '
EXEC sp_executesql @SQL

预期中文结果

返回结果包含以下汉化列的内容:

  • 引用对象架构名
  • 引用对象名称
  • 引用对象ID
  • 引用对象类别
  • 引用对象类别描述
  • 是否依赖调用者
  • 是否模糊引用

内容的提问来源于stack exchange,提问作者On3moy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:56:02