簡體   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