提高在T-SQL手动错误跳转到BEGIN CATCH块(Raise an error manuall

2019-08-17 10:32发布

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

这里是我的存储过程的身体:

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但是这太可怕了!

Answer 1:

您可以使用raiserror 。 更多的细节在这里

--from 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条款。 以下是详细内容。



Answer 2:

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

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

MSDN THROW(的Transact-SQL)

RAISERROR扔之间的差异在SQL服务器



Answer 3:

你要找的RAISERROR

从MSDN:

生成错误消息,并启动错误处理该会话。 RAISERROR可以参考存储在sys.messages目录视图中的用户定义的消息或动态地建立的消息。 该消息被返回作为服务器错误消息给调用应用程序或到TRY ... CATCH构造的相关联的CATCH块。

CodeProject上有一个很好的文章也介绍了深入的它是如何工作以及如何使用它的细节。



Answer 4:

SQL有错误筹集机制

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

只是仰望RAISERROR联机丛书。 不过..你要产生相应的严重性的错误,在严重程度0到第十一个错误不会导致你跳转到catch块。



Answer 5:

THROW(的Transact-SQL)

引发异常,执行转移到一个try ... catch构造的CATCH块在SQL Server 2017年。

请参考以下链接

T-SQL抛出异常



文章来源: Raise an error manually in T-SQL to jump to BEGIN CATCH block