保存破碎的存储过程

Yes*_*uez 5 sql-server stored-procedures

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

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

首先是这样的查询.

SELECT aa,bb,ab FROM table1 a JOIN table2 b ON.aa = ba

"ON"之后的时期显然导致了错误.修复它很容易,但据我所知,您无法保存已损坏的存储过程.事实上,当我打开存储过程(不修改它)并尝试使用那里的代码运行alter时,它失败并显示错误消息.

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

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

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

Pam*_*oud 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
Run Code Online (Sandbox Code Playgroud)

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