try-catch ブロックを含むストアド プロシージャがあります。catch ブロックでは、raiserror() を呼び出して、何らかのコンテキストでエラーを再スローします。
エラーが発生した場合、raiserror() が呼び出され、実行がストアド プロシージャから呼び出し元のコードにすぐに戻ることを期待していました。ただし、そうではないようです。ストアド プロシージャの実行は、return ステートメントに到達するまで継続するように見えます。その後、raiserror() が有効になります。
これは正しいですか? raiserror() は、return が呼び出されるか、ストアド プロシージャの最後に到達するまで効果がありませんか?
SQL Server 2012 を使用しています。
編集: ストアド プロシージャの詳細の要求に応じて、関連するコードのスニペットを次に示します。
DECLARE @ErrMsg VARCHAR(127) = 'Error in stored procedure ' + OBJECT_NAME(@@PROCID) + ': %s';
declare @UpdateDateRecordCount table (LastUpdated datetime, NumberRecords int);
begin try;
insert into @UpdateDateRecordCount (LastUpdated, NumberRecords)
exec sp_ExecuteSql
@UpdateCountQuery,
N'@LastUpdated datetime',
@LastUpdated = @LastUpdated;
if @@rowcount <= 0
begin;
return 0;
end;
end try
begin catch;
declare @InsertError varchar(128) = 'Error getting updated date record count: '
+ ERROR_MESSAGE();
RAISERROR (@ErrMsg, 16, 1, @InsertError);
end catch;
-- Attempt to loop through the records in @UpdateDateRecordCount...
@UpdateCountQuery 引数は次のように設定されます。
N'select LastUpdated, count(*) from dbo.Part where LastUpdated > @LastUpdated group by LastUpdated;'