繁体   English   中英

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

[英]T-SQL inserting query which consist error into another table

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

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

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

尝试这样的事情:

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) 

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

SQLServer提供内置函数,如ERROR_MESSAGE(),ERROR_NUMBER(),用于catch块。

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

所以

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块中提交或回滚,并且您的事务是不可注销的,那么您的插入最终会回滚,并且您没有错误记录。

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

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

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

根据返回号码处理它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM