保存破碎的存储过程

时间:2010-08-19 21:56:26

标签: sql-server stored-procedures

我今天收到了一张关于因存储过程损坏而导致应用程序损坏的故障。

存储过程已经工作了几个月,但今天当我检查它时发现了一些错误。

首先有一个像这样的查询。

选择a.a.        ,b.b        ,a.b FROM table1一个JOIN       表2 b       上。 a.a = b.a

“ON”后的时间段明显导致错误。 修复它很简单,但据我所知,您无法保存存储过程 那是破碎的。实际上,当我打开存储过程时,(不修改它) 并尝试使用那里的代码运行alter,它失败并显示错误消息。

通过我修复的存储过程还有其他错误,最终运行了alter。

我不明白这是怎么可能的,并且想知道什么可以改变并保存一个被破坏的存储过程。 据我所知,服务器根本没有任何变化,就像我之前提到的那样,这个存储过程在过去的几个月里一直在工作

感觉就像是在追捕鬼魂,任何信息都会受到高度赞赏。

1 个答案:

答案 0 :(得分:7)

我猜这是延迟名称解析的问题。

SQL Server将允许您创建引用在创建存储过程时不存在的对象的过程。在这种情况下,SQL选择将查询的编译推迟到运行时,相信在调用过程时对象将在那里,因此在创建过程时不会验证语法。
如果随后执行该过程时语法不正确,那么您将在该点获得错误,但在创建过程期间不会出现错误。

例如,如果table1和table2不存在,则此语句将完成且不会出现错误:

CREATE PROCEDURE testproc AS
SELECT  a.a 
        , b.b 
        , a.b 
FROM    table1 a 
        JOIN table2 b ON. a.a = b.a

当你去执行testproc时,你会收到以下错误: “多部分标识符”.a.a“无法绑定。”