【问题标题】:Raise an error manually in T-SQL to jump to BEGIN CATCH block在 T-SQL 中手动引发错误以跳转到 BEGIN CATCH 块
【发布时间】:2010-12-04 15:00:03
【问题描述】:

是否可以手动在存储过程中引发错误以停止执行并跳转到BEGIN CATCH 块? C#throw new Exception() 的一些模拟。

这是我的存储过程的主体:

BEGIN TRY
BEGIN TRAN

-- do something

IF @foobar IS NULL
    -- here i want to raise an error to rollback transaction    

-- do something next

COMMIT TRAN
END TRY
BEGIN CATCH
    IF @@trancount > 0
        ROLLBACK TRAN
    END CATCH

我知道一种方法:SELECT 1/0 但这太糟糕了!!

【问题讨论】:

    标签: sql sql-server tsql exception-handling try-catch


    【解决方案1】:

    您可以使用raiserror。阅读更多详情here

    --来自 MSDN

    BEGIN TRY
        -- RAISERROR with severity 11-19 will cause execution to 
        -- jump to the CATCH block.
        RAISERROR ('Error raised in TRY block.', -- Message text.
                   16, -- Severity.
                   1 -- State.
                   );
    END TRY
    BEGIN CATCH
        DECLARE @ErrorMessage NVARCHAR(4000);
        DECLARE @ErrorSeverity INT;
        DECLARE @ErrorState INT;
    
        SELECT 
            @ErrorMessage = ERROR_MESSAGE(),
            @ErrorSeverity = ERROR_SEVERITY(),
            @ErrorState = ERROR_STATE();
    
        -- Use RAISERROR inside the CATCH block to return error
        -- information about the original error that caused
        -- execution to jump to the CATCH block.
        RAISERROR (@ErrorMessage, -- Message text.
                   @ErrorSeverity, -- Severity.
                   @ErrorState -- State.
                   );
    END CATCH;
    

    编辑 如果您使用的是 SQL Server 2012+,则可以使用 throw 子句。 Here 是详细信息。

    【讨论】:

      【解决方案2】:

      您可以使用THROW(在 SQL Server 2012+ 中可用):

      THROW 50000, 'Your custom error message', 1
      THROW <error_number>, <message>, <state>
      

      MSDN THROW (Transact-SQL)

      Differences Between RAISERROR and THROW in Sql Server

      【讨论】:

      • 不能在函数中使用“THROW”。伤心。
      【解决方案3】:

      您正在寻找RAISERROR

      来自 MSDN:

      生成错误消息并 启动错误处理 会议。 RAISERROR 可以 引用用户定义的消息 存储在 sys.messages 目录中 动态查看或构建消息。 消息作为服务器返回 给调用者的错误信息 应用程序或关联的 CATCH TRY…CATCH 构造块。

      CodeProject 有一个good article,它还深入描述了它的工作原理和使用方法。

      【讨论】:

        【解决方案4】:

        SQL 有错误引发机制

        RAISERROR ( { msg_id | msg_str | @local_variable }
        { ,severity ,state }
        [ ,argument [ ,...n ] ] )
        [ WITH option [ ,...n ] ]
        

        只需在联机丛书中查找 Raiserror。但是..您必须生成一个适当严重性的错误,严重性 0 到 10 的错误不会导致您跳转到 catch 块。

        【讨论】:

          【解决方案5】:

          THROW (Transact-SQL)

          引发异常并将执行转移到 SQL Server 2017 中 TRY…CATCH 构造的 CATCH 块。

          请参考以下链接

          T-SQL Throw Exception

          【讨论】:

            猜你喜欢
            • 2021-12-02
            • 1970-01-01
            • 1970-01-01
            • 2014-01-26
            • 1970-01-01
            • 2018-11-18
            • 2014-05-12
            • 1970-01-01
            • 2012-08-27
            相关资源
            最近更新 更多