首页 > 解决方案 > catch 块中的 THROW 语句

问题描述

我需要在使用 SQL 存储过程输出参数调用应用程序时返回错误详细信息。如果我当时在 catch 块中使用 throw 以防过程未成功执行,则输出参数将不会设置错误详细信息,如果我忽略 throw 那么它将起作用。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[pt44]
(
    @a int,
    @b int,
    @Msg varchar(2000) output
)
as
begin
    DECLARE @c int
    begin try
        set @c= (@a+@b)
        print 'C Value :' +@c--cast(@c as varchar(20))  error is here
    end try
    begin catch
        set @Msg='Error No. '+CAST(ERROR_NUMBER() AS VARCHAR(200))+'Error Line. '+CAST(ERROR_LINE() AS VARCHAR(200))+' Error Message.'+ERROR_MESSAGE()  
        --;throw
    end catch
end

请告诉我如何将错误传递给调用应用程序并且还想在 SQL Server catch 块中使用 throw 的最佳方法。

标签: sqlsql-server

解决方案


如果没有 VB 6 中的结构化错误处理,可以使用它On Error来执行错误处理代码并捕获 SQL 错误详细信息。有关更多信息和示例,请参阅VB6 文档(不再维护)。

On Error GoTo ErrorHandler

' execute proc here
oCmd.Execute

' happy path code here
GoTo Done

:ErrorHandler
' this will show SQL error
MsgBox Err.Description

:Done

这是我通常使用的样板 T-SQL 捕获块代码:

BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END;

推荐阅读