查找特定列未更新的所有 SP

Piy*_*tel 3 sql-server dynamic-sql

我想查找未更新特定列的存储过程。

举个例子

SP1 :

BEGIN
      UPDATE YourTable
      SET    Foo = @Foo,
             Bar = @Bar
      WHERE  Id = @Id
  END 
Run Code Online (Sandbox Code Playgroud)

SP2 :

 BEGIN
      UPDATE YourTable
      SET    Foo = @Foo                 
      WHERE  Id = @Id
  END 
Run Code Online (Sandbox Code Playgroud)

因此,我想获取Bar上面示例中未更新的所有 SP,它应该返回SP2.

注意:一个 SP 可以有多个更新语句。是否有可能获得该更新语句的表名?

Aar*_*and 6

尝试这个:

SELECT DISTINCT OBJECT_NAME([object_id])
FROM sys.sql_dependencies AS d
WHERE referenced_major_id = OBJECT_ID('dbo.YourTable')
AND is_updated = 1
AND NOT EXISTS 
(
  SELECT 1 FROM sys.sql_dependencies AS id
   INNER JOIN sys.columns AS c
   ON id.referenced_major_id = c.[object_id]
   AND id.referenced_minor_id = c.column_id
   WHERE id.object_id = d.object_id
   AND id.referenced_major_id = d.referenced_major_id
   AND c.name = 'bar'
);
Run Code Online (Sandbox Code Playgroud)

注意事项:

  1. 您没有提到您的 SQL Server 版本。我假设您使用的是 2005+。
  2. 我不确定该is_updated列的可靠性如何。我已经看到与该is_selected列的严重不一致。
  3. 这确实取决于您的存储过程是在对象之后创建的,并且不受延迟名称解析的影响。您可能希望在依赖输出之前重新编译所有存储过程。
  4. 有关如何不能依赖依赖项的更多信息,请参阅此帖子

解析是一个真正的痛苦,因为你所有的陈述都可能有细微的变化。您可以搜索以下模式:

SELECT name FROM sys.procedures
  WHERE LOWER(OBJECT_DEFINITION([object_id]))
        LIKE '%update%yourtable%'
  AND LOWER(OBJECT_DEFINITION([object_id]))
      NOT LIKE N'%bar%=%';
Run Code Online (Sandbox Code Playgroud)

但这有各种各样的方式误入歧途 - 其中一些模式可能会出现在评论中,误报可能是因为您有更新yourtable2,您可能会错过一行,因为更新引用了列bar2,等等。

我在这里编写了一个非常全面的搜索程序,但它只会与您定义的搜索模式一样可靠: