SQL Server是否在运行之前验证存储过程?

Mik*_*ike 6 t-sql stored-procedures sql-server-2008

我现在检查了许多线程,我似乎无法找到答案,我需要相当肯定/相信我在回复客户端之前做出正确的判断.

所以,正如标题所述,SQL Server在运行之前是否验证了存储过程?

IE:即使我有一个IF statement永远不会满足某种条件的代码,IF statement condition在运行之前是否会检查并验证代码?

编辑:这是一个简单的例子:

DECLARE @ParamSource VARCHAR(2) = 'V3'

IF @ParamSource = 'V1'
BEGIN
    --USE LINKED SERVER HERE WHICH THROWS AN ERROR ABOUT CONNECTIONS
END

IF @ParamSource = 'V3'
BEGIN
    --DO MY ACTUAL CODE
END
Run Code Online (Sandbox Code Playgroud)

我永远不会满足第一个条件,但由于某种原因,我的存储过程试图在运行时验证并保持错误.

Phi*_*ppe 2

创建存储过程时,会对其进行编译,这意味着存储过程中使用的每个对象都经过验证。对于所有现有对象,您还需要有权访问它们。这将为该存储过程创建一个执行计划,只要该过程不更改,执行计划就应该保持有效。如果存储过程中使用的任何表对象不存在(仅表,而不是链接服务器),此时将不会创建执行计划,但如果没有发现其他错误,则会创建过程。

在您的示例中,您需要访问链接服务器对象才能创建存储过程。创建后,如果您不再有权访问链接服务器,您的程序仍将运行,但如果需要访问链接服务器,则会生成错误IF @ParamSource = 'V1'。但是,如果没有命中链接服务器IF @ParamSource = 'V3',则不会出现错误。

基本上,这意味着创建过程的用户需要有权访问链接服务器。