SQL批量插入:更新行

时间:2011-03-29 19:00:09

标签: sql-server sql-server-2008

我有一个从CSV批量插入表格的流程。我现在要求来自CSV的一些数据将包含“更新的”记录(先前导入但现在已更改的数据)。

此时我有一张满是重复的表格。是否可以根据PK更新BULK INSERT(甚至在插入之前删除)记录?

我不想在此过程中添加第二步以删除重复项。

编辑:我只是运行类似于以下的删除查询而不是临时表

declare @tbl table
(
id int,
ref nvarchar(10)
)

insert into @tbl
values(1, 'AAAA'),
(2, 'BBBB'),
(3, 'CCCC'),
(4, 'AAAA'),
(5, 'BBBB'),
(6, 'AAAA')

delete from @tbl where id in (
select id from
(
select
    id,
    ref,
    RANK() OVER(partition by ref order by id desc) as rnk
from @tbl) d
where rnk > 1
)

select * from @tbl

3 个答案:

答案 0 :(得分:6)

如果是我,我会加载到临时表并从那里进行重复。我不确定BCP是否具有该功能,但我会担心任何类型的逻辑,我没有直接和可见的控制。

它还会阻止您根据要加载的数据进行QC检查。使用临时表,您可以进行某种类型的PK比较,以确保您具有正确数量的不同值。

答案 1 :(得分:2)

批量加载到具有标识的临时表中,这样您就可以知道它们加载的顺序,并且可以处理任何重复项。然后,您可以通过多种不同方式填充实际表格(使用重复行的第一个/最后一个出现等),包括MERGE (Transact-SQL)

答案 2 :(得分:2)

使用临时表并执行upsert(MERGE - http://msdn.microsoft.com/en-us/library/bb522522.aspx

即使您要查看SSIS以执行此操作并在一个流中插入缺少的行,我仍然会将更新批量插入另一个流上的临时表并在SQL任务中运行单个UPDATE,因为运行用于更新的各行的SQL命令不是非常快。