讓我通過說我不是sql專家來作爲序言。預先感謝您審查我的問題。存儲過程將新記錄傳輸到連接的服務器失去連接
我有一個存儲過程週期性地失去了連接到一個鏈接服務器在傳輸新記錄到一個表(大量的記錄)中的一些麻煩。我想知道一些事情。
首先,有沒有更好的方法來完成更快,更高效的任務?
10第二,有沒有辦法更好地處理失敗的連接嘗試重新嘗試上一步,努力繼續停止它的位置,可能在等待15分鐘左右,以防萬一與鏈接服務器暫時斷開連接(可能會持續超過終止前允許的內容)?
此外,我很好奇,當類似的高亮步驟發生,如果正在對鏈接服務器執行的SQL,並連接丟失,確實SQL嘗試重新連接,並繼續對超時時間或因爲這是一個比較聲明,它只是打破?我真的不明白它是如何工作的。
這裏是連接丟失是最常見的,一般在第一個INSERT語句發生(第一步內開始catch塊)的部分:
UPDATE [LINKEDSERVER.XYZ.COM].dest_database1.dbo.run
SET last_result = 32
WHERE type = 158;
BEGIN TRY
INSERT INTO [LINKEDSERVER.XYZ.COM].[dest_database2].dbo.table1 (CID , BID , Question1 , Question2 , Question3 , Question4 , Question5 , Question6 , Question7 , Question8 , Question9 , Question10 , Comments , EmailAddress , Name , Address , Address2 , City , State , Zip)
SELECT src.CID , src.BID , src.Question1 , src.Question2 , src.Question3 , src.Question4 , src.Question5 , src.Question6 , src.Question7 , src.Question8 , src.Question9 , src.Question10 , src.Comments , src.EmailAddress , src.Name , src.Address , src.Address2 , src.City , src.State , src.Zip
FROM table1 AS src LEFT OUTER JOIN [LINKEDSERVER.XYZ.COM].[dest_database2].dbo.table1 AS dst ON src.CID = dst.CID AND src.BID = dst.BID
WHERE dst.CID IS NULL;
INSERT INTO [LINKEDSERVER.XYZ.COM].[dest_database2].dbo.table2 (CID , AccountNumber , Name , Address , Address2 , City , State , Zip , BShort, EmailAddress)
SELECT src.CID , src.AccountNumber , src.Name , src.Address , src.Address2 , src.City , src.State , src.Zip , src.BShort, src.EmailAddress
FROM table2 AS src LEFT OUTER JOIN [LINKEDSERVER.XYZ.COM].[dest_database2].dbo.table2 AS dst ON src.BShort = dst.BShort
WHERE dst.BShort IS NULL;
END TRY
BEGIN CATCH
SELECT @ErrorCode = @@Error;
SELECT @ErrorResult = 109;
SELECT @ErrorMessage = 'Failed Copy ' + CAST (@ErrorCode AS varchar) ;
GOTO ExitWithError;
END CATCH;
INSERT INTO [LINKEDSERVER.XYZ.COM].dest_database1.dbo.system_log (notes , log_type , source_type , parent_id)
VALUES ('Copied tables xyz ' , 45 , 58 , 0) ;
UPDATE [LINKEDSERVER.XYZ.COM].dest_database1.dbo.run
SET last_result = 31
WHERE type = 158;
我明白,如果連接丟失,我的catch塊不執行,所以不使用ExitWithError。我想我知道連接丟失時會發生回滾(不知道如何在連接的服務器上工作,因爲在發生這種情況時會傳輸一些記錄),並且它只是退出執行所有任務 - 因爲這些catch都沒有執行或者整個開始catch塊之後的語句。我希望在發生這種情況時記錄一些事情,以便存儲過程在再次運行時(設置爲每30分鐘運行一次直到成功運行),它可以提取它停止的地方,因爲我在開始時有代碼它查找最後的狀態/日誌條目並確定要執行的操作。 有沒有更好的方法來處理這個問題?
源服務器位於一個非常安全的防火牆之後,無法公開,因此其他服務器可以取而代之提取數據。至少我認爲是這樣。 這些ID不是數字或順序的。但也許我可以創建一個新的。我會研究這個,謝謝你的建議。 你的第3條和第4條建議很有趣。你可以給我更多關於使用OUTPUT插入的細節。INTO ... 另外,你有什麼想法,當連接丟失時實際發生什麼? SQL剛剛停止執行還是有辦法更好地處理它? 非常感謝。 – sds
當您鬆開連接時,您的事務回滾並且臨時表從內存中清除。這裏是一個鏈接輸出的插件.id到http://stackoverflow.com/questions/6292154/output-to-temporary-table-in-sql-server-2005。至少3或4,他們是一個大問題,但如果我這個週末有時間的話,我可能會最終回到它。就防火牆而言,我建議檢查一下,從鏈接服務器拉出而不是推送到鏈接服務器會對性能產生巨大影響。 – Matt
你說你在源和目的地有多少條記錄? – Matt