上拋出抓執行錯誤給一些背景細節,比方說有一個「人」表和存儲過程「PersonPerformance」返回給一個人的表現PERSONID。這兩個對象都駐留在鏈接的sql server 2000實例上。SQL Server 2008中 - 通過一個存儲過程運行鏈接服務器
我的目標是運行每個PERSONID的PersonPerformance proc和結果存儲在駐留在SQL Server 2008實例的表。如果執行存儲過程期間發生執行錯誤,我想說明它'失敗'併發送一封電子郵件,列出存儲過程完成時所有失敗的PersonId。
我使用try..catch塊,並檢查@@ ERROR試過!= 0,但也沒有工作。我假設這是因爲存儲過程在拋出錯誤後繼續執行,並最終返回結果,即使它們無效。存儲過程本身是一個很長的批次,沒有錯誤處理。
下面的代碼我到目前爲止:
{@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
我想我明白爲什麼它不工作,我預計我前面提到的原因(存儲過程持續),但我不知道是否有辦法避免這個問題,並且即使proc繼續,也可以捕獲執行錯誤。
這裏的執行過程中生成的輸出的快照:
101
The statement has been terminated.
Msg 2627, Level 14, State 1, Procedure OSPerfAttribution_ps, Line 626
Violation of PRIMARY KEY constraint '[email protected]__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的輸出這一事實使我相信一定會有搭上方式它。我只是很難找到我希望在這裏得到一些幫助。
不得已我可能只需要保存整個輸出到一個日誌文件,然後搜索錯誤。這不是一個選項的壞處,但我仍然想知道是否有辦法在執行過程中捕獲錯誤。
這樣做 - 我想這將是一個配置設置。 – Brandon 2013-03-06 19:50:06