2015-08-21 36 views
0

我试图找到验证所有sql server存储过程的方法。我曾尝试使用sp_recompile和​​,但它不起作用。检查Sql Server中存储过程的有效性

例如,这个存储过程编译没有问题,虽然表中没有存在

ALTER PROCEDURE sp_Foo 
WITH RECOMPILE 
AS 
BEGIN 
    SELECT Foo, Bar 
    FROM Table_That_Dont_Exist 
END 

当我尝试执行它引发错误。

Msg 208, Level 16, State 1, Procedure sp_Foo, Line 5 
Invalid object name 'Table_That_Dont_Exist'. 

有没有办法来检查存储过程是否有效或可以毫无问题地执行?提前

+0

除非您尝试访问它,否则验证某件事似乎很难; ala通过执行存储过程。为什么不执行来确定它是否有效? –

+1

这是因为sql server有一个称为延迟名称解析的功能。这意味着一个过程可以编译,即使它引用了还不存在的对象。直到它需要生成一个执行计划,这将是一个问题。 https://technet.microsoft.com/en-US/library/ms190686.aspx –

+0

我的主要问题是,我有一个很大的数据库存储过程。很多原因都是无效的(重命名列,删除表等)。我试图找到一种方法来验证所有数据库并检查所有程序。 @AaronMcIver,我试过了,但有存储过程接收参数。 – NioZero

回答

0

,你可以编写脚本全部关闭使用任务存储过程

谢谢 - >生成脚本功能。将所有脚本保存到单个文本文件中,然后创建解析器以编程方式解析文本并确定要检查的对象。这将是非常困难的,甚至接近100%正确。我正在研究实际运行的函数和过程,但问题是,如果传入的值导致代码块被跳过,那么它不会验证它们。

这可以验证所有的意见,虽然

SELECT 
    'SELECT TOP 1 * FROM ' + obj.name + ' GO;' [SQL] 
FROM sys.objects obj 
WHERE obj.[TYPE] IN ('V') 

这是一个开始。

+0

这对存储过程不起作用,如示例。 – NioZero

+0

这将如何帮助?他们仍然会编译得很好。 –

+0

改变检查对象和列我认为...现在重新检查 – UnhandledExcepSean

0

这是一个体面的起点找到缺少对象引用的程序,视图等。

select * 
from sys.sql_expression_dependencies 
where referenced_id is null 
    AND referenced_server_name is null --excludes link server missing items 
+0

缺少引用不仅是唯一的问题... – NioZero

+0

这不是一个完整的解决方案。注意我说缺少对象引用。正如你在评论中提到的,没有一种方法可以找到所有这些问题。 –