更新大量行 - SQL Server 2005

时间:2011-09-08 08:08:08

标签: sql-server sql-server-2005

我有几个以制表符分隔的文件,我想用它们来更新大量的行。到目前为止,我天真地创建了一个临时表并将数据导入其中,然后更新了表,其中还包含一个连接。这创建了一个大的trans日志。我想防止这种情况并以大块的方式进行。我发现了这个:

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 :(得分: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)进行调整