背景の詳細を説明するために、「Person」テーブルと、PersonIdを指定したPersonのパフォーマンスを返すストアドプロシージャ「PersonPerformance」があるとします。これらのオブジェクトは両方とも、リンクされたSQLServer2000インスタンスに存在します。
私の目標は、PersonIdごとにPersonPerformance procを実行し、その結果をSqlServer2008インスタンスにあるテーブルに格納することです。ストアドプロシージャの実行中に実行エラーが発生した場合は、「失敗」したことに注意し、ストレージプロセスの完了時に、失敗したすべてのPersonIdをリストした電子メールを送信します。
try..catchブロックを使用して@@error!= 0をチェックしようとしましたが、どちらも機能しませんでした。これは、ストアドプロシージャがエラーをスローした後も実行を継続し、有効ではない場合でも最終的に結果を返すためだと思います。ストアドプロシージャ自体は1つの長いバッチであり、エラー処理はありません。
これが私がこれまでに持っているコードです:
{@ReturnTable is defined here}
declare cur cursor for
select PersonId from [linked-server-name].DB.dbo.Person
open cur
declare @pId int
fetch next from cur into @pId
while (@@FETCH_STATUS = 0)
begin
begin try
print(@pId)
insert into @ReturnTable exec [linked-server-name].DB.dbo.PersonPerformance @pId
end try
begin catch
print('store person that failed here')
end catch
fetch next from cur into @pId
end
close cur
deallocate cur
前述の理由(ストアドプロシージャが続く)で期待どおりに機能しない理由は理解できたと思いますが、その問題を回避して、プロシージャが継続しても実行エラーをキャッチする方法があるかどうか疑問に思っています。
実行中に生成された出力のスナップショットは次のとおりです。
101
The statement has been terminated.
Msg 2627, Level 14, State 1, Procedure OSPerfAttribution_ps, Line 626
Violation of PRIMARY KEY constraint 'PK__@SecMaster__2CD2DAF1'. Cannot insert duplicate key in object '#2BDEB6B8'.
The statement has been terminated.
Msg 515, Level 16, State 2, Procedure OSPerfAttribution_ps, Line 1047
Cannot insert the value NULL into column 'BasketBenchmarkId', table '@ReturnTable'; column does not allow nulls. INSERT fails.
(3 row(s) affected)
102
(36 row(s) affected)
106
(32 row(s) affected)
エラーメッセージがストアドプロシージャから外部SQLの出力に伝播しているという事実は、それをキャッチする方法が必要であると私に信じさせます。方法がわからないので、ここで助けを求めています。
最後の手段として、出力全体をログファイルに保存し、エラーを検索する必要があります。これはそれほど悪いオプションではありませんが、実行中にエラーをキャッチする方法があるかどうかを知りたいです。