4

我对MS世界了解不多,但现在恰好是我必须使用SQL Server Management Studio 2008。

我的问题:我在表中有一个列,我需要查看所有可能对其起作用的存储过程。

我尝试右键单击并转到“查看依赖项”,但这似乎并没有返回它应该返回的所有内容。

像这样的问题:SQL Server Dependencies有提供 3 种解决方案的答案

  1. 付费第三方工具。
  2. 编写自己的脚本。
  3. 将所有内容导出到文本文件中并对其进行 grepping。

怎么回事?我错过了一些明显的东西吗?事情真的是这样运作的吗?我想这是一个非常常见的用例:你想改变表并且你想确保你不会破坏任何东西。或者,如果您是第一次使用数据库查看一个新项目,并且您想查看某些列是如何填充存储过程的。实际上没有快速简便的内置工作流程来执行此操作吗?

4

5 回答 5

8

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

在此处输入图像描述

在此处输入图像描述

对于任何 DBA 或数据库开发人员来说,它都是一个很棒的必备工具——我是否已经提到它完全免费用于任何用途?

于 2012-06-27T14:56:25.940 回答
1

使用此查询:

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%YOUR COLUMN %' 
AND ROUTINE_TYPE='PROCEDURE'
于 2012-06-27T15:08:22.970 回答
1

我花了很多时间试图找到一种快速识别列级别依赖项的方法,而无需搜索文本或使用第三方应用程序。另一个挑战是跨多个数据库查找表名可能重复的依赖关系,这会在搜索 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')
于 2014-04-03T18:23:03.110 回答
0

我想知道为什么您无法通过“查看依赖项”对话框看到依赖项,因为它对我来说非常好用。不过,您可以查询 'sys.sql_expression_dependencies' 系统视图并获取所需的依赖信息。

例子

SELECT OBJECT_NAME(referencing_id),OBJECT_NAME(referenced_id)  
FROM sys.sql_expression_dependencies 
WHERE referenced_id = OBJECT_ID('XXX')

您当然可以投射您可能需要的其他信息。

于 2012-06-27T15:03:33.690 回答
0

单个查询中所有依赖对象的列表。

从 sys.procedures A 中选择不同的 A.name A.object_id = B.object_id 上的内部连接 ​​sys.sql_dependencies B;

或者

select distinct A.name from sys.objects A 内部连接 ​​sys.sql_dependencies B on A.object_id = B.object_id where A.type_desc = '提到你的对象类型';

于 2019-01-09T07:16:38.330 回答