1

テーブル(メインテーブル)で挿入/削除を実行するプログラムを作成しました...私のプログラムは、このテーブルで実行された操作(挿入/削除)のログも別のテーブル(監査ログテーブル)に書き込みます...プログラムは、監査ログテーブルのメインテーブルで実行されたすべての成功または失敗した操作のログを書き込みます...監査ログテーブルに、操作が失敗した場合に操作の失敗の理由を移動したいフィールドが 1 つあります。メインテーブル..

-503 、 +100 、 -803 のような sqlcodes の理由を知っています ...しかし、可能なすべての SQL コードに理由を挿入したいです...

T-SQL に変数はありますか?そこからSQLエラーテキストメッセージをテーブルに挿入できます..?? またはそれを行う他の方法はありますか?

4

3 に答える 3

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 に 2 つの列しかないことを前提としています。最初の列はエラー番号用で、2 番目の列はエラー メッセージ用です。次の機能を使用できます。

ERROR_LINE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL) 
于 2012-05-09T15:42:10.367 に答える
0

はい、いくつかの複雑さと制限がありますが、これを行うことができます。これは推奨事項ではなく、単なる回答です。

SQLServer には、catch ブロックで使用するための ERROR_MESSAGE()、ERROR_NUMBER() などの組み込み関数が用意されています。

挿入/削除コードが自動コミット モード (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 ブロックでコミットまたはロールバックせず、トランザクションがコミットできない場合、挿入は最終的にロールバックされ、エラーの記録はありません。

クライアントがトランザクションを管理している場合、クライアントがロールバックを発行するエラー ハンドラに問題がない限り、エラー情報を記録できない場合があります。また、ロールバックを発行すると、実際の根本原因を覆い隠すエラーが生成される場合があります。複雑さについてくよくよすることなく、クライアントがトランザクションを管理している場合、クライアントにエラーをキャッチして記録させる方がはるかに簡単です。

于 2012-05-09T16:42:00.193 に答える
-1

--エラーがあるかどうかを確認してください----

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

返された番号に基づいて処理します

于 2012-05-09T15:58:25.047 に答える