我有一个基于文件的导入项目,用户可以在其中发布要导入到数据库中的文件。插入新的记录,并更新已经存在的ID的记录。 insert into #bulk values (1,'John')insert into #bulk values (2,'Sally')insert into #bulk values (3,'Paul')insert into #bulk values (4,'Gretchen')insert into #bulk values (5,'Penny')insert into #bulk values (5,'Peggy') create table #target(id int not null,name varchar(10),primary key (id))
在用
身份证名称
5傻
他们可以通过在
身份证名称
5莎莉
我将文件的大容量插入(c windows服务)到大容量表(sqlserverazurev12)中。这些文件可以包含数百万行,因此我希望避免遍历行。在大容量插入之后,我有一个SP进行合并更新/插入并更新已经存在的行并插入新的行。
我遇到的问题是,当用户在同一个文件中发布新记录并更正同一记录时。我在目标表上遇到主键冲突。
有什么好办法解决这个问题吗?
下面是一个例子:--drop table #bulk--drop table #targetcreate table #bulk(id int,name varchar(10))
merge #target as targetusing(select id, name from #bulk) as bulktableon target.id = bulktable.idwhen matched then updateset target.name = bulktable.namewhen not matched theninsert(id, name) values (bulktable.id, bulktable.name);
最佳答案
这将处理name的最新值。
您需要一个新的“批量”创建脚本
CREATE TABLE #bulk
(
row_id int identity(1,1),
id int,
name varchar(10)
)
这是可用于新大容量表的脚本:
;WITH CTE as
(
SELECT
id, name,
row_number() over (partition by id order by row_id desc) rn
FROM #bulk
), CTE2 as
(
SELECT id, name
FROM CTE
WHERE rn = 1
)
MERGE #target as target
USING CTE2 as bulktable
on target.id = bulktable.id
WHEN matched and
not exists(SELECT target.name except SELECT bulktable.name)
-- this will handle null values. Otherwise it could simply have been:
-- matched and target.name <> bulktable.name
THEN update
SET target.name = bulktable.name
WHEN not matched THEN
INSERT(id, name) VALUES (bulktable.id, bulktable.name);
关于sql - 与主键冲突合并,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34789751/