T-SQL将包含错误的查询插入到另一个表中

时间:2012-05-09 15:37:10

标签: sql tsql

我创建了一个程序来对表(主表)执行插入/删除...我的程序还在另一个表(审计日志表)中为此表执行的操作(插入/删除)的日志写入。 .. 程序为审计日志表中主表上执行的每个成功或失败操作写入日志...我的审计日志表中有一个字段,我想移动操作失败的原因,如果操作失败主表..

我知道sqlcodes的原因如-503,+ 100,-803 ......但我想为每个SQL代码插入原因...

T-SQL中是否有任何变量,我可以从中将sql错误文本消息插入表中。 或者还有其他方法可以做到吗?

3 个答案:

答案 0 :(得分:4)

尝试这样的事情:

BEGIN TRY
    -- Do your work on main table
END TRY
BEGIN CATCH

    INSERT INTO LOG_TABLE
    SELECT ERROR_NUMBER(),
           ERROR_MESSAGE()
END CATCH

这假设LOG_TABLE只有两列,第一列是错误号,第二列是错误消息。您可以使用以下功能:

ERROR_LINE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL) 

答案 1 :(得分:0)

是的,你可以做到这一点,有一些复杂性和局限性。这不是一个推荐,只是一个答案。

SQLServer提供内置函数,例如ERROR_MESSAGE(),ERROR_NUMBER(),以便在catch块中使用。

如果插入/删除代码在自动命令模式下运行(没有begin tran,没有隐式事务),那么只需在catch块中记录错误消息和数字就可以了,因为插入和删除已经回滚或提交。 / p>

所以

begin try
    -- do work
end try
begin catch
    insert into audit_table select ERROR_MESSAGE(), ERROR_NUMBER()
end catch

可以工作。

如果您的TSQL代码或客户端使用begin tran或隐式事务,catch块中的逻辑必须考虑这一点,否则在原始事务回滚时将回滚错误记录,不留下任何记录错误。

如果你有类似的东西......

begin try
    begin tran
    -- do work
    if xact_state() = 1 commit tran
    if xact_state() = -1 rollback tran
end try
begin catch
    -- Now there is a good chance a transaction is still pending or uncomittable.
    if xact_state() != 0 rollback tran -- assuming you always rollback.
    -- Insert will be recorded because previous transaction was cleared.
    insert into audit_table select ERROR_MESSAGE(), ERROR_NUMBER()
end catch

如果您没有在catch块中提交或回滚,并且您的事务是不可注销的,那么您的插入最终会回滚,并且您没有错误记录。

如果客户端正在管理事务,则可能无法记录错误信息,除非客户端发出回滚的错误处理程序没有问题。发出回滚本身可能会产生一个掩盖真正根本原因的错误。如果客户端没有处理复杂性,如果客户端正在管理事务,那么让客户端捕获并记录错误也会容易得多。

答案 2 :(得分:-1)

- 检查是否存在错误----

  BEGIN  
         RAISERROR('something is wrong',16,2)  
         RETURN -20008  ---specify
    END

根据退货编号

处理