查找SQL Server 2008中对表列的所有引用

时间:2013-03-08 22:22:31

标签: sql-server-2008

有没有办法在SQL Server 2008数据库中查找对表列的所有引用?我需要知道引用该列的其他表或存储过程或视图。

4 个答案:

答案 0 :(得分:4)

如果您需要按名称查找数据库对象(例如表格,列,触发器) - 请查看名为SQL Search免费红门工具,它会执行此操作 - 它会搜索您的整个数据库中的任何类型的字符串。

enter image description here

enter image description here

对于任何DBA或数据库开发人员来说,这是一个非常必备的工具 - 我是否已经提到它绝对免费用于任何用途?

答案 1 :(得分:2)

您可以尝试使用ApexSQL Search等工具。它搜索对象名称,但它也会搜索依赖对象列表,即使依赖表/视图中的列的命名方式不同也是如此。

其他解决方案是使用系统视图和/或系统函数来获取所需的数据。建议使用sys.foreign_keys, sys.objects, sys.all_columns来获取所需的数据。

答案 2 :(得分:2)

当我需要分析由于表格架构更改而产生的影响时,我使用以下步骤进行分析。这可能不完整但有用!

  1. Sp_help [TableName]:这有助于我找到所有FOREIGN KEY约束参考。我还可以找到任何其他表引用此表作为FOREIGN Key。
  2. Sp_depends [TableName]:这有助于使用此表查找过程,函数和视图。
  3. 暴力方法:我使用不同的系统表和函数来检查SQL作业,模块等中的特定关键字
  4. 供参考:     Sp_help [TableName]     Sp_depends [TableName]

    select top 10 * from msdb.dbo.sysjobsteps where command like '%%'
    
    SELECT top 10 Name, OBJECT_DEFINITION(OBJECT_ID)
    FROM sys.procedures
    WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%%' 
    
    SELECT top 10 OBJECT_NAME(object_id), *
    FROM sys.sql_modules
    WHERE definition LIKE '%%'
    

答案 3 :(得分:1)

我花了很多时间试图找到一种快速识别列级依赖项的方法,而不必搜索文本或使用第三方应用程序。另一个挑战是在可能重复表名称的多个数据库之间找到依赖关系,这将在搜索SP文本时导致误报。

从SQL 2008开始,有一个函数可以在字段级别上返回数据库之间的依赖关系。

下面的代码可以使用,但有一些例外:

  • 如果已删除表/字段上具有无效引用的存储过程,它将失败(顺便说一句,我发现这对于查找被表修改意外破坏的SP很有用)。
  • 在SP以异常方式使用临时表的情况下,它不会找到所有依赖项。
  • 在某些情况下,我发现它为复杂的存储过程返回了误报。

MSDN Documentation

此代码应在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,

--this will tell you the reference type
ref.is_selected,
ref.is_updated

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')