【问题标题】:Why return -1 is not working as expected为什么 return -1 没有按预期工作
【发布时间】:2016-11-25 06:09:52
【问题描述】:

我是 SQL Server 的新手。请帮我解决这个问题

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 级,状态 1,第 13 行
在此上下文中不能使用具有返回值的 RETURN 语句

任何人都可以阐明这里发生的事情以及我该如何纠正它?我需要在这里返回-1。

提前致谢

【问题讨论】:

  • 与其返回值,不如在调用过程中使用输出变量和消费
  • 当您引发错误时,执行将在 RAISE 语句处停止。第一个过程中的代码永远不会遇到RETURN 语句,因为RAISERROR 会停止执行并引发异常。 SQL Server 已经认识到这一点,并告诉您永远不会看到返回值,这是正确的。我建议完全摆脱您的第一个程序,因为它没有增加任何价值:它与开箱即用的 RAISERROR 完全相同。遇到异常时使用RAISERROR。您不需要自定义过程。

标签: sql-server exception-handling procedure raiserror


【解决方案1】:

你需要使用 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

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2021-01-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多