2011-01-12 130 views
2

我還沒有被使用的結構的存儲過程類似於以下語法錯誤

BEGIN TRY 
BEGIN TRANSACTION 

    IF EXISTS (SELECT Something FROM Somewhere WHERE Something = '123abc') 
     GOTO FINISHED 

    IF NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = 'abc123') 
     SET @ReturnCode = 2 

    FINISHED: 

    COMMIT TRANSACTION 

END TRY 
BEGIN CATCH 

    ROLLBACK TRANSACTION 

END CATCH 

假設GOTO。我得到以下兩個錯誤

Line 183 
Incorrect syntax near 'F'. 
Line 183 
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 2. 

如果我有BEGINEND的存儲過程返回正常的包裹最後IF。這很好,並照顧我的語法問題。

問題是我有兩個不同的服務器上這個確切的存儲過程。一個人總是會得到錯誤,而且從來沒有像上面那樣得到錯誤。

我能想到的唯一的事情是,在一臺服務器上可能會打開一些SQL設置,但在另一臺服務器上卻沒有。有沒有人曾經有過這樣的事情發生過?

更多詳細信息:有問題的服務器已過時,但第二臺服務器安裝了SP2後未安裝Service Pack。目前正在升級過程中。稍後將更新結果。

+0

或者,也許當什麼也沒有發生在其他的觸發器被一臺服務器上開除了? – 2011-01-12 13:10:28

回答

0

爲什麼不反轉第一個IF上的邏輯並完全消除GOTO廢話?

BEGIN TRY 
    BEGIN TRANSACTION 

    IF NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = '123abc') 
     AND NOT EXISTS (SELECT Something FROM Somewhere WHERE Something = 'abc123') 
     SET @ReturnCode = 2 

    COMMIT TRANSACTION 

END TRY 
BEGIN CATCH 

    ROLLBACK TRANSACTION 

END CATCH 
+0

當存儲過程有幾百/千行時,標籤可以使讀取更容易。在SQL之外,我決不會做這樣的事情。但我的問題仍然是爲什麼我會在一臺服務器上遇到問題,而不是另一臺服務器上的語法問題 – Ciaran 2011-01-12 16:17:48