有没有办法在SQL Server 2008数据库中查找对表列的所有引用?我需要知道引用该列的其他表或存储过程或视图。
答案 0 :(得分:4)
如果您需要按名称查找数据库对象(例如表格,列,触发器) - 请查看名为SQL Search的免费红门工具,它会执行此操作 - 它会搜索您的整个数据库中的任何类型的字符串。
对于任何DBA或数据库开发人员来说,这是一个非常必备的工具 - 我是否已经提到它绝对免费用于任何用途?
答案 1 :(得分:2)
您可以尝试使用ApexSQL Search等工具。它搜索对象名称,但它也会搜索依赖对象列表,即使依赖表/视图中的列的命名方式不同也是如此。
其他解决方案是使用系统视图和/或系统函数来获取所需的数据。建议使用sys.foreign_keys, sys.objects, sys.all_columns
来获取所需的数据。
答案 2 :(得分:2)
当我需要分析由于表格架构更改而产生的影响时,我使用以下步骤进行分析。这可能不完整但有用!
供参考: 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所在的数据库内运行,以便能够与其他数据库依赖项交叉。
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')