sql - 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 的最佳方法。
解决方案
如果没有 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;
推荐阅读
- javascript - 是否可以在 Salesforce 中自定义自定义标签的样式和文本?
- virtual-machine - 连接存储域出现问题(主机 host2 无法访问存储域
) - android - 新 Android 版本中的后台服务
- laravel - Vue组件在隐藏的下拉菜单下不呈现html
- r - 有效的cumsum问题,不能低于零
- python - 如何在不需要收件人安装 python 3 的情况下分发 python 代码?
- paypal - PayPal 订阅 API - 如何应用折扣
- asp.net - ASP.NET安全配置错误(无法连接sql)
- azure - Docker compose 无法在 Windows-2019 ADO 构建代理上运行
- c# - 使用 c# 代码更改模板中的标签内容不起作用