次のように再スローできる場合があります:
..
END TRY
BEGIN CATCH
DECLARE @errnum int;
SELECT @errnum = ERROR_NUMBER();
RAISERROR (@errnum, 16, 1);
END CATCH
ただし、ERROR_NUMBER() の sys.messages 行に %s などのプレースホルダーがあるため、意味が失われる可能性が高くなります。
番号を含めて元のメッセージを再スローするために、このようなことを行うことができます
..
END TRY
BEGIN CATCH
DECLARE @errnum nchar(5), @errmsg nvarchar(2048);
SELECT
@errnum = RIGHT('00000' + ERROR_NUMBER(), 5),
@errmsg = @errnum + ' ' + ERROR_MESSAGE();
RAISERROR (@errmsg, 16, 1);
END CATCH
最初の 5 文字は元の番号です。
ただし、ネストされたコードがある場合は、「00123 00456 エラー テキスト」になります。
個人的には、コードが実行されないエンジン エラー (パラメーターの欠落など) とエラー (50000) を区別するために、SQL 例外番号のみを扱います。
最後に、戻り値として渡すことができます。
これについて質問しました:SQL Server エラー処理:例外とデータベース クライアント コントラクト