SQL Server:如何获取存储过程引用的跨数据库表及列信息
跨数据库存储过程表/列引用获取方案
原脚本依赖的sys.sysdepends是SQL Server过时的系统视图,仅能捕获当前数据库内的对象依赖,无法识别跨数据库的引用(如DatabaseB.dbo.TableX这类写法)。以下是修改后的脚本及说明:
修改后脚本
USE DatabaseA; GO SELECT DISTINCT SCHEMA_NAME(o.schema_id) + '.' + o.name AS SP_Name, -- 拼接完整的引用对象标识(含数据库、架构) CASE WHEN ed.referenced_database_name IS NOT NULL THEN ed.referenced_database_name + '.' + ed.referenced_schema_name + '.' + ed.referenced_entity_name ELSE SCHEMA_NAME(ro.schema_id) + '.' + ro.name END AS Table_Name, c.name AS Field_Name FROM sys.objects o JOIN sys.sql_expression_dependencies ed ON o.object_id = ed.referencing_id LEFT JOIN sys.objects ro ON ed.referenced_id = ro.object_id -- 跨库关联列信息,通过四部分对象ID匹配 LEFT JOIN sys.columns c ON CASE WHEN ed.referenced_database_name IS NOT NULL THEN OBJECT_ID(ed.referenced_database_name + '.' + ed.referenced_schema_name + '.' + ed.referenced_entity_name) ELSE ro.object_id END = c.object_id AND ed.referenced_minor_id = c.column_id WHERE o.type = 'P' -- 仅筛选存储过程 AND ed.referenced_entity_name IS NOT NULL AND ed.referenced_class = 1 -- 仅捕获对象类型的引用(表、视图等)
关键修改说明
- 替换依赖视图:用
sys.sql_expression_dependencies替代sys.sysdepends,该视图支持捕获跨数据库、甚至跨服务器的对象引用,且依赖信息更准确。 - 解析跨库标识:通过
referenced_database_name、referenced_schema_name字段提取跨库引用的完整对象路径,避免仅显示表名导致的歧义。 - 跨库列关联:利用
OBJECT_ID()函数生成跨库表的对象ID,以此关联对应数据库的sys.columns视图,获取列名信息。 - 精准筛选:通过
referenced_class = 1确保只捕获表、视图这类对象的引用,排除其他类型的依赖(如函数、存储过程自身)。
补充注意事项
- 若存储过程包含动态SQL生成的引用,
sys.sql_expression_dependencies无法自动捕获,需使用sys.dm_sql_referenced_entities函数逐个解析存储过程,示例调用:SELECT referenced_entity_name, referenced_minor_name FROM sys.dm_sql_referenced_entities('DatabaseA.dbo.YourSP', 'OBJECT'); - 执行脚本的账号需具备访问目标跨数据库的
sys.objects、sys.columns视图的权限。
内容的提问来源于stack exchange,提问作者JJWillMC
相关产品推荐
相关产品推荐

