用THROW替换RAISERROR

时间:2014-01-06 14:23:19

标签: sql-server tsql sql-server-2012

在历史上我的程序中,我总是遇到异常,然后在ROLLBACK之后提出异常。我在MSDN中看到推荐的方法(对于SQL2012 +)是THROW

基于此示例程序:

CREATE PROC my_procName

    @id int

AS
    BEGIN TRY
        BEGIN TRAN

            UPDATE [tbl_A] WHERE (ID=@id);
            UPDATE [tbl_B] WHERE (fkID=@id);
            UPDATE [tbl_C] WHERE (fkID=@id);

        COMMIT TRAN
    END TRY

    BEGIN CATCH
        ROLLBACK TRAN
        DECLARE @ErrMsg nvarchar(4000)
        DECLARE @ErrSeverity int
        SET @ErrMsg = ERROR_MESSAGE()
        SET @ErrSeverity = ERROR_SEVERITY()
        RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
GO

这是抛出异常的正确方法,同时保留ROLLBACK

CREATE PROC my_procName

    @id int

AS
    BEGIN TRY
        BEGIN TRAN

            UPDATE [tbl_A] WHERE (ID=@id);
            UPDATE [tbl_B] WHERE (fkID=@id);
            UPDATE [tbl_C] WHERE (fkID=@id);

        COMMIT TRAN
    END TRY

    BEGIN CATCH
        ROLLBACK TRAN
        THROW
    END CATCH
GO

我已经查看了MSDN,Google和此网站的示例,但没有一个包含ROLLBACK,所以这只是一个快速的问题,可以绝对肯定。

1 个答案:

答案 0 :(得分:2)

仅在THROW声明之前的记录声明应以分号结束。但通常你的方法是正确的 - 然后批处理结束批处理因此必须是你想要在catch块中执行的最后一个语句。您可以选择使用THROW参数: THROW [ { error_number | @local_variable }, { message | @local_variable }, { state | @local_variable } ] [ ; ]