我在SQL Server中有一个带有try catch的存储过程。我想在catch循环中做的是调用自己的存储过程来记录所有错误变量,如下所示:
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
exec log.LogError ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_MESSAGE();
END CATCH;当我运行这段代码时,我得到了一个关于括号的错误。
我可以运行:
select ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_MESSAGE();我也可以做
print ERROR_NUMBER()我想要做的是只有一行代码调用带有参数的存储过程,因为我将在许多存储过程中使用这一行,并且不希望在具有try-catch的每个存储过程中有大量代码设置错误参数(我将具有多于这三个参数)。
有人知道如何将它们传递到另一个存储过程中吗?
你好,约翰
发布于 2011-03-30 05:41:55
尝试更改您的log.LogError过程,使其直接访问ERROR_NUMBER()和其他错误函数。在documentation中有一个例子。
发布于 2011-03-30 06:12:52
不幸的是,T-SQL不是一种干性代码重用、语法紧凑、程序员友好的语言。你必须以一种很难的方式来做,这意味着在每个CATCH块中至少编写4-5行代码。此外,您还需要考虑事务语义:它是否已回滚?或者更糟的是,你是否处于注定失败的交易中?这就是我创建这个T-SQL error handling template的原因
create procedure [usp_my_procedure_name]
as
begin
set nocount on;
declare @trancount int;
set @trancount = @@trancount;
begin try
if @trancount = 0
begin transaction
else
save transaction usp_my_procedure_name;
-- Do the actual work here
lbexit:
if @trancount = 0
commit;
end try
begin catch
declare @error int, @message varchar(4000), @xstate int;
select @error = ERROR_NUMBER()
, @message = ERROR_MESSAGE()
, @xstate = XACT_STATE();
if @xstate = -1
rollback;
if @xstate = 1 and @trancount = 0
rollback
if @xstate = 1 and @trancount > 0
rollback transaction usp_my_procedure_name;
raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
return;
end catch
end它比你想要的要长吗?应该是的。是这样的吗?是。
最后,如何在事务性环境中处理日志记录?插入到日志表中的内容将与其他所有内容一起回滚,以防出错。有时这是可以的,其他时候甚至是需要的,但有时是有问题的。最有趣的解决方案之一是Simon Sabin的Logging messages during a transaction。
https://stackoverflow.com/questions/5479189
复制相似问题