2012-05-09 71 views
1

我做了一個程序來執行在表(主表)上的插入/刪除...我的程序還爲此操作(插入/刪除)寫了一個日誌這個表在另一個表(審計日誌表)... 該程序寫在審計日誌表中的主表上執行每個成功或失敗的操作日誌...我有我的審計日誌表中的一個字段,我想移動操作失敗的原因,如果操作將失敗的主表..T-SQL插入查詢包含錯誤到另一個表

我知道sqlcodes像-503,+100,-803 ...的原因...但我想插入每個SQL的原因代碼可能...

是在T-SQL中有任何變量,從哪裏可以將sql錯誤文本消息插入到表中。 或者還有其他方法可以做到嗎?

回答

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) 
+0

+1:哦,ERROR_()函數的樂趣! – MatBailie

-1

--check ----它的基礎上returnd數

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

手柄

+0

這裏的問題是如何獲得所引發的錯誤文本。 – Gabe

0

是的,你可以做到這一點,用一些:您可以使用這些功能複雜性和侷限性。這不是一個建議,只是一個答案。

SQLServer提供內置函數,例如用於catch塊的ERROR_MESSAGE(),ERROR_NUMBER()。

如果您的插入/刪除代碼以自動合併模式運行(不開始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塊回滾,您的交易是uncomittable,您的插入最終回滾,你有沒有記錄錯誤。

如果客戶端正在管理事務,則可能無法記錄錯誤信息,除非客戶端與發出回滾的錯誤處理程序沒有問題。發佈回滾本身可能會產生一個掩蓋真正根本原因的錯誤。如果客戶正在管理交易,就不需要考慮複雜性,讓客戶也可以更容易地捕捉和記錄錯誤。

相關問題