2016-11-25 4 views
1

Ich bin neu in SQL Server. Bitte helfen Sie mir bei dieser AusgabeWarum Rückgabe -1 nicht wie erwartet funktioniert

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

Dies funktioniert einwandfrei. Also habe ich dies in einem gemeinsamen Verfahren wie folgt aus:

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

Nun, wenn ich diese Prozedur aus einer anderen Prozedur rufen

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 

Ich erhalte eine Fehlermeldung

Msg 178, Ebene 15, Zustand 1, Zeile 13
Eine RETURN-Anweisung mit einem Rückgabewert kann in diesem Zusammenhang nicht verwendet werden

Kann jemand etwas Licht auf das werfen, was hier passiert und wie kann ich es korrigieren? Ich muss hier -1 zurückgeben.

Vielen Dank im Voraus

+0

Statt der Rückkehr Wert zu fangen, ist es gut, Ausgangsvariablen zu verwenden und – User

+0

in der rufenden Prozedur verbrauchen Wenn Sie einen Fehler aus Die Ausführung endet bei der Anweisung "RAISE". Der Code in Ihrer ersten Prozedur trifft niemals die 'RETURN'-Anweisung, weil' RAISERROR' die Ausführung stoppt und die Ausnahme auslöst. SQL Server hat dies erkannt und sagt Ihnen, dass Sie den Rückgabewert nie sehen werden, und es ist richtig. Ich schlage vor, dass Sie Ihre erste Prozedur ganz weglassen, weil sie keinen Mehrwert bringt: Sie macht genau das, was der "RAISERROR" von Anfang an tut. Verwenden Sie 'RAISERROR', wenn Sie eine Ausnahme haben. Sie benötigen keine benutzerdefinierte Prozedur. –

Antwort

0

Sie try-Block verwenden, müssen Sie die 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 
Verwandte Themen