0

我寫過一個存儲過程。其中我想檢查一個條件,如果該條件變成真,那麼我不想繼續存儲過程的其餘部分。由於在存儲過程中使用RETURN導致的問題

如果返回false,那麼我想繼續存儲過程的其餘部分。

我的存儲過程是在這裏:

IF (@RefPOID <> 0) 
    BEGIN 
    IF EXISTS(// SELECT STATEMENT) 
    BEGIN 
    SET @Status = 'Please select the Items'     
     RETURN 
    END 
END 
    IF(POID = 0) 
    BEGIN 

      //INSERTION 

    END 
    ELSE 
    BEGIN 

      //DELETION 

    END 

此存儲過程已經成功編譯。不過,雖然從前端調用此存儲過程,它顯示的錯誤

System.Data.SqlClient.SqlException:當前 命令發生了 嚴重錯誤。結果,如果有的話,應該丟棄 。

如果我從存儲過程中刪除了RETURN語句,那麼它的工作正常。

如果條件變爲false,則存儲過程在我從前端調用時工作正常。

但我想檢查那裏的情況,如果它是真的返回。

我確信由於存在RETURN問題。

爲什麼會出現問題?出了什麼問題?如何解決這個問題?請提供任何建議。

+1

使用了'RETURN'在交易中間 - 你需要的'RETURN'前添加一個'ROLLBACK TRANSACTION'正常終止運行的事務...... –

+0

非常真實的。有關在T-SQL中使用TRY CATCH的詳細信息,請參閱。此鏈接中有一節標題爲「TRY ... CATCH with RAISERROR」,並且有一節標題爲「B.在...中使用TRY ... CATCH交易「,提供有用的例子。 –

+0

@marc:是marc。你說的是絕對正確的。謝謝。 – thevan

回答

1

如果您打算指示失敗狀態,那麼我會試着在調用此存儲過程之前執行驗證檢查,或者在TRY CATCH塊中使用RAISERROR。

BEGIN TRY 

IF (@RefPOID <> 0) 
BEGIN 
     IF EXISTS(SELECT 1 FROM @Item I WHERE NOT EXISTS(SELECT P.ItemID FROM PUR_POIndent P WHERE P.ItemID = I.ItemID AND P.D1 = I.D1 AND P.D2 = I.D2 AND P.D3 = I.D3 AND P.POID = @RefPOID)) 
      BEGIN 
      RAISERROR('Please select Items only related to the Reference Purchase', 16, 1) 
      RETURN 
     END 
END 

... 
END TRY 
BEGIN CATCH 

DECLARE @ErrorMessage NVARCHAR(MAX); 
     DECLARE @ErrorSeverity INT; 
     DECLARE @ErrorState INT; 

      SELECT @ErrorMessage = ERROR_MESSAGE(), 
        @ErrorSeverity = ERROR_SEVERITY(), 
        @ErrorState = ERROR_STATE(); 

      RAISERROR (@ErrorMessage, -- Message text. 
         @ErrorSeverity, -- Severity. 
         @ErrorState -- State. 
         ); 
END CATCH 
+0

@Moose:我在我的問題中提到了錯誤,當我從前端調用時得到的。 – thevan

+0

@thevan:查看的「備註」部分,您會看到raiserror的工作方式。它指出,「由RAISERROR生成的錯誤操作與由數據庫引擎代碼生成的錯誤相同」,所以最終會出現SQLException。您可以使用RAISERROR分配用戶定義的錯誤編號,如有必要,您可以在SQLException中檢查該錯誤編號。我認爲這是SQLException類的「Number」屬性。請參閱

1

我不認爲你的回報是問題。該查詢可能無效。 但是,如果你刪除了回報,你說它有效。這很奇怪。

請您發佈完整的代碼?

您是否試圖在查詢分析器或工作室管理器中運行?

您有:

SELECT 1 FROM @Item 

這是有效的?什麼是@Item - 一個表變量?

+0

是的,它是一個表變量。該查詢工作正常。如果我刪除了RETURN,則存儲過程正在工作。 – thevan

+0

請發佈完整的sp代碼。謝謝 – kheya

+0

你是否期待你的應用程序有任何數值返回值? – kheya

相關問題