我有几个以制表符分隔的文件,我想用它们来更新大量的行。到目前为止,我天真地创建了一个临时表并将数据导入其中,然后更新了表,其中还包含一个连接。这创建了一个大的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
答案 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)进行调整