sql-server - 用 THROW 替换 RAISERROR

标签 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,所以这只是一个快速的问题,以确保绝对确定。

最佳答案

只是为了在THROW 语句之前的record 语句应该以分号结束。但通常您的方法是正确的 - THROW 结束批处理,因此必须是您要在 catch block 中执行的最后一条语句。您可以选择将 THROW 与参数一起使用: 抛出 [ { 错误编号 | @local_variable }, { 留言 | @local_variable }, { 状态 | @local_variable } ] [ ; ]

关于sql-server - 用 THROW 替换 RAISERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20952017/

相关文章:

sql - 没有连接的插入语句会导致先前不存在重复项的重复项?

sql - Sql Server中图片数据类型转String时的字符问题

sql - 如何从没有键的 JSON 字符串中提取值?

sql-server - SQL Server 约束允许 "two unique"值

asp.net - SQL Server 2005是否将错误消息号传递回asp.net应用程序?

sql-server - sql server 除了存储过程结果

sql - 有没有一种方法可以使用月份编号而不是月份名称来搜索 SQL 查询?

sql-server - 添加附加条件时出现 "No Join Predicate"- 为什么?

sqlclr - 为 CLR 函数设置 SCHEMABINDING 和 IsDeterministic

sql-server - 使用 SC 排序规则的 SQL Server Unicode 查询