首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将错误详细信息从catch传递到日志存储过程

将错误详细信息从catch传递到日志存储过程
EN

Stack Overflow用户
提问于 2011-03-30 05:31:07
回答 2查看 3.5K关注 0票数 1

我在SQL Server中有一个带有try catch的存储过程。我想在catch循环中做的是调用自己的存储过程来记录所有错误变量,如下所示:

代码语言:javascript
复制
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;

当我运行这段代码时,我得到了一个关于括号的错误。

我可以运行:

代码语言:javascript
复制
select ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_MESSAGE();

我也可以做

代码语言:javascript
复制
print ERROR_NUMBER()

我想要做的是只有一行代码调用带有参数的存储过程,因为我将在许多存储过程中使用这一行,并且不希望在具有try-catch的每个存储过程中有大量代码设置错误参数(我将具有多于这三个参数)。

有人知道如何将它们传递到另一个存储过程中吗?

你好,约翰

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-30 05:41:55

尝试更改您的log.LogError过程,使其直接访问ERROR_NUMBER()和其他错误函数。在documentation中有一个例子。

票数 1
EN

Stack Overflow用户

发布于 2011-03-30 06:12:52

不幸的是,T-SQL不是一种干性代码重用、语法紧凑、程序员友好的语言。你必须以一种很难的方式来做,这意味着在每个CATCH块中至少编写4-5行代码。此外,您还需要考虑事务语义:它是否已回滚?或者更糟的是,你是否处于注定失败的交易中?这就是我创建这个T-SQL error handling template的原因

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5479189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档