2009-12-07 41 views
0

我正在查看來自其中一個Web應用程序的錯誤,它正在調用負責更新數據庫中的記錄的存儲過程。爲什麼尾隨SET不一致地在SQL中引發錯誤?

此存儲過程已運行數週,沒有問題。然後有一天它開始拋出錯誤,而調試時我們發現原因在存儲過程中。

它基本上有如下語句

Begin 
    // Do Stuff 

    Set 
End 

所以SET實際上從未設定任何東西。出於某種原因,我們的服務器運行得非常好,並且在客戶端服務器上運行良好,直到今天早些時候它決定開始抱怨爲止。 (錯誤的語法錯誤)

是否有任何類型的SQL Server設置會導致此行爲突然變化?

澄清 - 該SET一直在程序中。並且單獨運行SET,或者作爲存儲過程中的唯一聲明實際上對我很有用。這是問題,它不應該工作。那麼是否有什麼會導致它在失敗時起作用呢?

回答

3

SET這樣的過程通常會無法編譯,即使SET不能達到:由於ALTER失敗

alter procedure dbo.testproc as 
    begin 
    return 1; 
    set 
    end 

Incorrect syntax near the keyword 'SET'. 

,我看不出該過程可能會在最終的數據庫在第一位?

或者您可能正在以SQL Server 2000的兼容模式運行(但仍允許這樣做)。將兼容性mdoe更改爲SQL Server 2005或更高版本將會中斷該過程。

+0

@Andomar,那個過程對我來說很好。 (假設我先創建它)。 – Brandon 2009-12-07 19:05:35

+0

@Brandon:你使用的是哪個版本的SQL Server?數據庫的兼容模式是什麼? (數據庫屬性 - >選項) – Andomar 2009-12-07 19:07:49

+1

我正在運行SQL Server 2005,但數據庫的兼容性設置爲SQL Server 2000. – Brandon 2009-12-07 19:10:49

2

執行「SET」本身會產生錯誤。我原本建議你可能有分支代碼(IFs,RETURNs,GOTOs等),導致該行永遠不會被觸及......但是我發現我無法創建一個包含此行爲的獨立存儲過程,獨自陳述。

如果您編寫腳本並嘗試重新創建它(使用不同的名稱),是否可以創建它?

可能值得發佈該腳本,或者儘可能多地發佈,因爲您可以輕鬆公開發布該腳本。

+0

@Philip,實際上自己執行SET不會產生錯誤,至少不會產生錯誤:P我們有分支代碼,但是同一分支始終是第一個執行的分支。這不是一個邊緣情況或任何事情。被調用的過程和分支經常被調用。 – Brandon 2009-12-07 19:04:40

相關問題