sql >> データベース >  >> RDS >> Sqlserver

エラー報告時の SQL Server コール スタックの記録

    わかりました。エラー処理を再度追加します:-)

    ERROR_%() 関数は、CATCH ブロックのスコープに表示されます。これは、各 CATCH ブロックのストアド プロシージャまたは関数呼び出しでそれらを使用できることを意味します

    また、ネストされたストアド プロシージャを使用すると、何がエラーを引き起こし、何がエラーをログに記録しているかを知ることができます

    ...
    END TRY
    BEGIN CATCH
        IF XACT_STATE() <> 0 AND @starttrancount = 0 
            ROLLBACK TRANSACTION
        EXEC dbo.MyExceptionHandler @@PROCID, @errmsg OUTPUT;
        RAISERROR (@errmsg, 16, 1);
    END CATCH
    
    ---with this handler (cut down version of ours)
    CREATE PROCEDURE dbo.MyExceptionHandler
        @CallerProcID int,
        @ErrorMessage varchar(2000) OUTPUT
    WITH EXECUTE AS OWNER --may be needed to get around metadata visibility issues of OBJECT_NAME
    AS
    SET NOCOUNT, XACT_ABORT ON;
    
    BEGIN TRY
        SET @ErrorMessage = --cutdown
                CASE
                    WHEN @errproc = @callerproc THEN        --Caller = error generator
                            --build up stuff
    
                    ELSE    --Just append stuff             --Nested error stack
                END;
    
        IF @@TRANCOUNT = 0
            INSERT dbo.Exception (Who, TheError, WhatBy, LoggedBy)
            VALUES (ORIGINAL_LOGIN()), RTRIM(ERROR_MESSAGE()), ERROR_PROCEDURE(), OBJECT_NAME(@CallerProcID));
    END TRY
    BEGIN CATCH
       --and do what exactly?
    END CATCH
    GO
    

    とにかく、これが基本的な考え方です。各 CATCH ブロックは単純で、作業はエラー ハンドラで行われます。例:ERROR_NUMBER() を追加 したい場合



    1. JDBIの@BindBeanは、INSERT中にBeanクラスで名前付きパラメーターを検出しません

    2. SQL Serverから空の行を返すことは可能ですか?

    3. 一時テーブルへのコピーに時間がかかります

    4. 大量挿入前に.csvファイルの日付をSQL形式に変換する方法