2013-06-19 90 views
0

我的項目必須處理龐大的數據庫。在最壞的情況下,它可以是超過80百萬行。更新或插入SQL Server時忽略錯誤行

現在,我有2個表T1T2。我必須將數據從表T1複製到表T2

  • 如果表T1一個行表T2(同一主鍵)已經存在,則更新T1該行的其他列數據T2
  • 否則插入新行到T2

起初,我用while循環遍歷80個百萬行T1然後更新或插入到T2。這非常非常慢,完成需要超過10個小時。但是,如果任何行導致錯誤,我可以忽略它,並捕捉錯誤。

在那之後,我喜歡用一個查詢:

update Table2 
set T2.Column1 = T1.Column1,T2.Column2=T1.Column2 
from Table2 T2 JOIN Table1 T1 ON T1.ID=T2.ID 

這是更快,只需要大約1> 2小時完成。但是,如果任何行有錯誤,則查詢根本無法執行。

所以,我的問題是:

  • 有什麼辦法,上面的查詢可以忽略錯誤行並繼續有效行執行?

  • 如果沒辦法,我可以做到這一點,我能做些什麼來比第一種方法運行更快,也可以捕獲錯誤行?

P/S:我試圖將表拆分到多個小部分,然後更新或在同一時間插入所有小部分,但它確實不是更快的。

我已經用我的第二種方法解決了這個問題。在插入或更新行時,我使用TRY_CAST來防止發生異常。任何無效的數據都將爲NULL。完成後,我比較2個表並找到不同的行。這些行是錯誤行。

回答

0

我用我的第二種方法解決了這個問題。在插入或更新行時,我使用TRY_CAST來防止發生異常。任何無效的數據都將爲NULL。完成後,我比較2個表並找到不同的行。這些行是錯誤行。

0

至於功能,你所要求的,我建議如下:

MERGE INTO table2 target 
USING 
(
    SELECT id, column1, column2 FROM table1 
) source ([id], [column1], [column2]) 
ON target.[Id] = source.[Id] 
WHEN MATCHED THEN 
    UPDATE SET 
     target.Colum1 = source.Column1, 
       target.COlumn2 = source.Column2 
WHEN NOT MATCHED BY SOURCE THEN 
DELETE 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT ([Id], [Column1], [Column2]) 
    VALUES([Id], [Column1], [Column2]) 
; 

至於忽略的錯誤 - 我看到這樣的錯誤的。在這方面,我會投入一些努力數據驗證

+0

謝謝。運行這些錯誤:Msg 4104,Level 16,State 1,Line 7 無法綁定多部分標識符「SOURCE.ID」。 – user2500561

+0

你可以檢查你的select語句是否在「unsing」中一起工作。它可能發生的錯誤將會重複。如果它會 - 比你應該在你的SELECT中尋找問題 –

+0

謝謝。我用第二種方法解決了這個問題。在插入或更新行時,我使用TRY_CAST來防止發生異常。任何無效的數據都將爲NULL。完成後,我比較2個表並找到不同的行。這些行是錯誤行。 – user2500561

0

您可以嘗試從T2中刪除現有的行,然後批量插入從T1的所有行。它取決於現有行的數量,如果它太大,那麼這種方法將無法工作。

相關問題