我今天收到了一张关于因存储过程损坏而导致应用程序损坏的故障。
存储过程已经工作了几个月,但今天当我检查它时发现了一些错误。
首先有一个像这样的查询。
选择a.a. ,b.b ,a.b FROM table1一个JOIN 表2 b 上。 a.a = b.a
“ON”后的时间段明显导致错误。 修复它很简单,但据我所知,您无法保存存储过程 那是破碎的。实际上,当我打开存储过程时,(不修改它) 并尝试使用那里的代码运行alter,它失败并显示错误消息。
通过我修复的存储过程还有其他错误,最终运行了alter。
我不明白这是怎么可能的,并且想知道什么可以改变并保存一个被破坏的存储过程。 据我所知,服务器根本没有任何变化,就像我之前提到的那样,这个存储过程在过去的几个月里一直在工作
感觉就像是在追捕鬼魂,任何信息都会受到高度赞赏。
答案 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“无法绑定。”