2016-11-25 94 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 
相关问题