2011-09-08 64 views
2

我有幾個製表符分隔的文件,我想用它來更新大量的行。到目前爲止,我已經天真地創建了一個臨時表,並將數據導入到臨時表中,然後更新了涉及連接的表。這創建了一個大型的轉錄日誌。我想阻止這種情況,並以大塊的形式進行。我發現這一點:更新大量的行 - SQL Server 2005

http://itknowledgeexchange.techtarget.com/itanswers/bulk-update-in-sql-server-2005/

這是最好的辦法嗎?

是否還有更快的方法(SSIS,bcp)?

任何反饋高度讚賞。謝謝。

基督教

PS:

我的天真代碼如下所示。 Unfort。我不是主鍵(該表有一個,因爲Bla是另一個表的子項)

drop table #temp 
create table #temp 
(
    i int, 
    xml nvarchar(max) 
) 
BULK INSERT #temp 
... 

update a 
set XML = b.xml 
from Bla as a 
inner join #temp as b on a.i = b.i 
+1

你的表是否有主鍵?或者是否有其他一些指標可以讓下一批能夠輕鬆開始最後一批的完成?事實上,涉及的表的結構和更新聲明是什麼? –

+0

我無法真正看到任何顯而易見的方法來改善您的鏈接中的技術,基於該結構, –

+0

謝謝馬丁。這種'TOP技術'是否自動提交事務,從而阻止事務日誌的增長。我沒有看到任何明確的交易內容......謝謝。 – cs0815

回答

2

您是否在目標表中有索引標識列?這是我真正喜歡使用WHILE循環的少數情況之一。您發佈的鏈接中解決方案的主要問題是索引使用不良。

DECLARE @START INT, @FINISH INT, @LOOPEND INT 
    SELECT @START = 1, @FINISH = 5000, @LOOPEND = MAX(ID) 
    from Bla 

    WHILE @START <= @LOOPEND 
    BEGIN 
     update a 
     set XML = b.xml 
     from Bla as a 
     inner join #temp as b on a.i = b.i 
     WHERE a.ID BETWEEN @START AND @FINISH 

     SET @START = @FINISH + 1 
     SET @FINISH = @FINISH + 5000 
    END 

在你有一個代理鍵(標識列作爲主鍵),這是不那麼常見的情況下,這將導致一個簡單的索引查找在主鍵和可調簡單地通過生長量(5000在這個例子中)

+0

我的情況是目標表'a'有它自己的主鍵。列'我'被索引但沒有主鍵(我使用查詢優化器)。我已經嘗試了像你一樣的「循環解決方案」,但一直在逐行進行。我喜歡你的方法,今晚會嘗試。謝謝。 – cs0815