2016-11-25 96 views
1

我是SQL Server的新手。請幫我解決這個問題爲什麼返回-1不能按預期工作

RAISERROR('There is a problem in the code',16,1) 
RETURN -1 

這工作得很好。所以我把這個在這樣一個普通的程序:

CREATE procedure [dbo].[Raise_Error] 
    (@ErrorMsg varchar(6000) , 
    @ErrorSeverity integer = 16, 
    @ErrorState integer = 1) 
AS 
BEGIN   
    RAISERROR (@ErrorMsg, @ErrorSeverity, @ErrorState) 
    RETURN -1 
END 

現在,當我從另一個調用程序此過程

CREATE PROCEDURE TEST_ORIG 
AS 
BEGIN 
    IF NOT EXISTS (SELECT * FROM table where FISCALYEAR='2016') 
    BEGIN 
     EXEC utils.dbo.[Raise_error] 
      @ErrorMsg = 'There are no valid records for  processing'        
     RETURN -1 
    END 

我收到一條錯誤消息

消息178,級別15,State 1,Line 13
帶有返回值的RETURN語句不能用於此上下文中

任何人都可以點亮這裏發生的事情,我該如何糾正它?我需要在這裏返回-1。

在此先感謝

+0

,而不是返回值,它是很好的使用輸出變量和消費調用過程 – User

+0

在當你拋出一個錯誤,執行停止在'RAISE'語句。你的第一個程序中的代碼從不會碰到'RETURN'語句,因爲RAISERROR'停止執行並拋出異常。 SQL Server已經認識到這一點,並告訴你永遠不會看到返回值,這是正確的。我建議徹底擺脫你的第一個程序,因爲它沒有增加任何價值:它確實是開箱即用的'RAISERROR'所做的。有異常時使用'RAISERROR'。您不需要自定義過程。 –

回答

0

你需要使用try塊捕獲RAISEERROR

CREATE PROCEDURE TEST_ORIG 
    AS 
    BEGIN 
     BEGIN TRY 
     IF NOT EXISTS (SELECT * FROM table where FISCALYEAR='2016') 
     BEGIN 
      EXEC utils.dbo.[Raise_error] 
       @ErrorMsg = 'There are no valid records for  processing'        
      RETURN -1 
     END 
     END TRY 
     BEGIN CATCH 
      SELECT ERROR_MESSAGE() 
     END CATCH 
    END 
相關問題