我花了很多时间试图找到一种快速识别列级别依赖项的方法,而无需搜索文本或使用第三方应用程序。另一个挑战是跨多个数据库查找表名可能重复的依赖关系,这会在搜索 SP 文本时导致误报。
从 SQL 2008 开始,有一个函数可以在字段级别返回跨数据库的依赖关系。
下面的代码有一些例外情况:
- 如果在已删除的表/字段上存在具有无效引用的存储过程,它将失败(顺便说一下,我发现这对于查找被表修改意外破坏的 SP 很有用)。
- 在 SP 以不寻常的方式使用临时表的情况下,它不会找到所有依赖项。
- 在某些情况下,我发现它为复杂的存储过程返回了误报。
MSDN 文档
此代码应从 SP 所在的数据库中运行,以便能够跨越其他数据库依赖项。
SELECT
--SP, View, or Function
ReferencingName = o.name,
ReferencingType = o.type_desc,
--Referenced Field
ref.referenced_database_name, --will be null if the DB is not explicitly called out
ref.referenced_schema_name, --will be null or blank if the DB is not explicitly called out
ref.referenced_entity_name,
ref.referenced_minor_name
FROM sys.objects AS o
cross apply sys.dm_sql_referenced_entities('dbo.' + o.name, 'Object') ref
where o.type in ('FN','IF','V','P','TF')