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 可以有多个更新语句。是否有可能获得该更新语句的表名?
尝试这个:
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)
注意事项:
is_updated列的可靠性如何。我已经看到与该is_selected列的严重不一致。解析是一个真正的痛苦,因为你所有的陈述都可能有细微的变化。您可以搜索以下模式:
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,等等。
我在这里编写了一个非常全面的搜索程序,但它只会与您定义的搜索模式一样可靠:
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |