使用游标遍历Schema内表并获取表依赖的SQL实现问题
问题解决:遍历指定Schema基表获取依赖关系
问题说明
需实现用游标遍历指定Schema下的所有基表,通过sys.dm_sql_referencing_entities获取每张表的依赖关系,但现有代码存在语法错误及数据覆盖问题。
错误点分析
- 对象名拼接未加引号:调用
sys.dm_sql_referencing_entities时,第一个参数要求是带单引号的对象名称,原代码直接拼接变量会触发语法错误。 - 临时表重复创建覆盖数据:每次循环都删除并重建临时表,最终仅能保留最后一张表的依赖数据,无法收集所有表的结果。
修正后的完整代码
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
相关产品推荐
相关产品推荐

