Sql server 已保存损坏的存储过程

Sql server 已保存损坏的存储过程,sql-server,stored-procedures,Sql Server,Stored Procedures,我今天收到一张罚单,是关于一个坏的应用程序,它是由一个坏的存储过程引起的 这个存储过程已经运行了几个月了,但是今天我检查它时发现了一些bug 首先是这样一个问题 选择a.a ,b.b ,a.b 从表1中选择一个JOIN 表2 b 在…上a、 a=b.a “开启”之后的时间段显然导致了错误。 修复它很容易,但据我所知,您无法保存存储过程 那是坏的。事实上,当我打开存储过程时,(没有修改它) 并尝试使用那里的代码运行alter,但失败并显示错误消息 我修复了存储过程,最终运行alter,在存储过程中

我今天收到一张罚单,是关于一个坏的应用程序,它是由一个坏的存储过程引起的

这个存储过程已经运行了几个月了,但是今天我检查它时发现了一些bug

首先是这样一个问题

选择a.a ,b.b ,a.b 从表1中选择一个JOIN 表2 b 在…上a、 a=b.a

“开启”之后的时间段显然导致了错误。 修复它很容易,但据我所知,您无法保存存储过程 那是坏的。事实上,当我打开存储过程时,(没有修改它) 并尝试使用那里的代码运行alter,但失败并显示错误消息

我修复了存储过程,最终运行alter,在存储过程中还出现了其他类似的错误

我不明白这是怎么可能的,我想知道如何更改和保存一个已损坏的存储过程。 据我所知,服务器根本没有任何更改,正如我前面提到的,这个存储过程在过去几个月一直在工作


这感觉就像我在追捕一个鬼魂,任何信息都将非常感谢。

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

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

例如,如果表1和表2不存在,则此语句将完整无误:

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.。

从sys.procedures运行select name、create_date、modified_date、*并找出在DB上创建过程的时间。检查它是否未更改。+1。我从来没有注意到这一点。这一天还很年轻,我已经学到了一些东西。事实上,几天后我遇到了这种情况,“我”用一个临时表创建了一个存储过程。虽然我还没有弄清楚存储过程是如何在没有发出警告的情况下更改/中断的,但我现在已经做了一些备份,希望这种情况不会再次发生。那么,关于“这是如何发生的?”问题,您是否尝试过内置报告?SQL 2K5和2K8具有在后台运行的默认跟踪,该跟踪捕获服务器上的所有对象更改。通过服务器或数据库级别的架构更改历史报告可以看到更改。只需右键单击相关数据库,选择Reports->Standard Reports->Schema Changes History。可用历史记录的数量将取决于有多少活动,但SQL Server会在线保留5个跟踪文件。它们以20MB的速度回滚或服务器重启,以先到者为准。