わかりました。エラー処理を再度追加します:-)
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()
を追加 したい場合