0

背景の詳細​​を説明するために、「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の出力に伝播しているという事実は、それをキャッチする方法が必要であると私に信じさせます。方法がわからないので、ここで助けを求めています。

最後の手段として、出力全体をログファイルに保存し、エラーを検索する必要があります。これはそれほど悪いオプションではありませんが、実行中にエラーをキャッチする方法があるかどうかを知りたいです。

4

1 に答える 1

0

SET XACT_ABORT ONバッチ全体をロールバックする場合に使用します。

http://msdn.microsoft.com/en-us/library/ms188792.aspx

于 2013-03-06T19:30:35.607 に答える