2

我正在使用SQL Server 2008和SSMS 2012.我有一個存儲過程引用一個不存在的表。編輯器在違規表上顯示紅色下劃線以表明有問題。SQL Server:存儲過程存儲錯誤

然而,當我執行查詢,我得到的消息成功完成

指令(S)。

這是非常討厭的。我也連接到另一臺機器的引擎,它遇到了同樣的問題,這意味着它在服務器上,而不是ssms。數據庫中是否存在某種設置來確定數據庫是否檢查存儲過程的語法?請幫忙!

澄清: 我知道語法是錯誤的。問題在於,即使SSMS引用了一個不存在的表,SSMS也允許我執行CREATE或ALTER語句而不會出錯。我希望它失敗。通常它會,但由於某種原因,它突然停止發出錯誤。我想讓它給我錯誤。我該怎麼做呢?

+1

長話短說,你不能。 [這個問題](http://stackoverflow.com/questions/8713129/sql-server-avoid-deferred-compilation)涵蓋了同樣的問題。 – Pondlife

+0

我編寫了一個腳本來嘗試編譯存儲過程,並提醒我們是否有數據庫更改打破了其中的任何一個,並且我發現它有時會提醒我們並且有時仍會編譯。最奇怪的是,我們有一個存儲過程不止一次地引用了一個刪除的表,並且當試圖編譯時,它在一個引用上拋出一個錯誤,然而在修復了一個它沒有錯誤編譯的引用之後,即使這個EXACT同一張表在存儲過程的其他部分被引用! 根據您的經驗,您有任何見解嗎? – Shock

回答

0

發生什麼事是管理工作室中的IDE沒有刷新模式模型。由於SSMS的本地實例不知道該表存在,它會在表名稱下引發紅線;當您真正運行sproc/query時,發送到數據庫的代碼將正確評估並運行。

刷新SSMS本地數據,嘗試按Ctrl-Shift-R,如所描述here.

編輯:

你可能要考慮Deferred Name Resolution

+0

我認爲你誤會了我。我知道表不存在,編輯器給我紅色下劃線,但它仍然允許我執行ALTER或CREATE語句而不出錯,從而向數據庫提交一個無效的存儲過程。 Ctrl + Shift + R不會改變這一點。 – mtmurdock

+2

啊,我的不好。您可能需要查看延遲名稱解析:http://msdn.microsoft.com/en-us/library/ms190686(v=sql.105).aspx – lyrisey

+0

好吧,是的,這正是我的問題。所以沒有辦法改變這種行爲? – mtmurdock

2

你的語法是罰款和被檢查時,您創建存儲過程。然而,直到存儲過程被編譯並且執行存儲過程時纔會檢查表的存在。

+1

這不是事實,我曾經得到錯誤,說「那個對象不存在」。 – mtmurdock

+1

我已經在SQL Server 2000,2005,2008,2012上測試過了。行爲是一樣的。我總是可以創建存儲過程,但是當我嘗試執行存儲過程時出現錯誤。 –

+2

我相信你。但是,我曾經得到錯誤,我喜歡他們。我想讓他們回來。這對我來說是一個非常有用的調試工具。 – mtmurdock