【发布时间】:2015-09-17 13:09:33
【问题描述】:
我现在检查了很多线程,但我似乎无法找到答案,我需要相当确定/确信我在回复客户之前假设这个是正确的。
所以,如标题所述,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
我永远不会满足第一个条件,但由于某种原因,我的存储过程试图在运行时验证并不断出错。
【问题讨论】:
-
它们在最初构建时(至少部分地)被验证,但不是在运行时。然而,对于从未验证过的动态 SQL 来说,情况并非如此。这是来自个人经验,而不是来自任何文档。但是,如果您想测试这个理论,您可以针对测试表构建一个简单的存储过程,然后从测试表中删除一列。存储过程仍会尝试运行,但会抛出错误。
-
@user2366842- 感谢您的回复...我认为它验证或执行这些操作的原因是因为我正在设置
Disaster Recovery environment和@987654326 之一@ 使用了一个链接服务器,由于某种原因我无法连接(但是,我不需要满足那个条件,我可以删除这段代码,但我只是想知道这是否是 SQL 正在做的事情?) -
延迟名称解析和编译:technet.microsoft.com/en-us/library/ms190686(v=sql.105).aspx(链接已更新)
-
这一切都取决于您所说的“已验证”。
-
使用链接服务器,您通常会在 SSMS 中遇到语法高亮问题,但只要链接服务器实际设置正确,它就会运行/“编译”。至于是否应该删除它的问题......如果链接服务器不再存在,最好简单地注释掉有问题的代码,而不是删除它(尤其是看到 SSMS 没有任何在没有数据库恢复的情况下恢复对存储过程的更改)。
标签: sql-server-2008 tsql stored-procedures