2010-08-19 39 views
5

今天我收到一張有關由存儲過程中斷導致應用程序損壞的故障單。已保存的損壞的存儲過程

存儲過程已經工作了幾個月,但今天當我檢查它時,我發現了一些錯誤。

首先有這樣的查詢。

SELECT A.A ,b.b ,A·B FROM表1一個JOIN 表2 b ON。 a.a = b.a

之後的「ON」明顯引起錯誤。 修復它很容易,但據我所知,您不能保存已損壞的存儲過程 。實際上,當我打開存儲過程時(不修改它) 並嘗試運行帶有來自那裏的代碼的alter,它失敗並顯示錯誤消息。

還有像這樣的其他錯誤通過存儲過程,我固定到最後運行alter。

我不明白這是如何可能的,並且想知道什麼可以改變並保存已損壞的存儲過程。 從我已經告訴服務器根本沒有任何變化,就像我之前提到的這個存儲過程一直在過去幾個月工作

感覺就像我在找一個鬼,任何信息將不勝感激。

+1

從sys.procedures中運行select name,create_date,modified_date,*並找出在DB上創建過程的時間。檢查它沒有改變。 – 2010-08-19 22:03:37

回答

7

我猜這是延遲名稱解析的問題。

SQL Server將允許您創建引用存儲過程創建時不存在的對象的過程。在這種情況下,SQL選擇將查詢的編譯推遲到運行時,相信在調用過程時對象將在那裏,因此在創建過程時語法不會被驗證。
如果隨後執行的過程語法不正確,那麼您將在此時發生錯誤,但不會在創建過程期間發生錯誤。

例如,如果Table 1和Table不存在,該語句將完成而不會出現錯誤:

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

當你去執行testproc,你會得到以下錯誤: 「多部分標識符「.aa」無法綁定。「

+0

+1。我從未注意到這一點。這一天還很年輕,我已經學到了一些東西。 – 2010-08-20 06:23:24

+0

我幾天後遇到了這種情況,其中「I」用臨時表創建了一個存儲過程。 雖然我還沒有想出存儲過程如何改變/打破了警告,我現在已經做了一些備份,我希望這不會再發生。 – 2010-08-26 16:04:24

+0

因此,關於「這是怎麼發生的?」問題,您是否嘗試過內置報告? SQL 2K5和2K8在後臺運行默認跟蹤,捕獲服務器上的所有對象更改。通過服務器或數據庫級別的「架構更改歷史記錄」報告可以看到更改。只需右鍵單擊相關數據庫,選擇報告 - >標準報告 - >模式更改歷史記錄。可用的歷史數量將取決於有多少活動,但SQL Server保持5個跟蹤文件聯機。它們以20MB或服務器重新啓動時,以先到者爲準。 – 2010-08-27 21:47:19