批量插入时更新或跳过具有重复主键的行 - SQL

时间:2016-06-27 10:20:44

标签: sql-server csv bulkinsert

我使用批量插入方法从CSV文件插入行。但它会在重复的主键上失败。

这是我的示例代码:

Use People
Go
BULK
INSERT tblProfile
FROM 'F:\People.txt'
WITH
(
DATAFILETYPE='widechar',
CODEPAGE = 'ACP',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
ERRORFILE = 'F:\ErrorRows.csv'
)
GO

我需要更新重复主键上的字段'行。

例如,这是我的表格样本:

Code   Name   Family   City
---------------------------
45     Joe    Stone    USA
67     Sara   Stone    USA
68            Stone   

如果有一行代码" 68"在CSV文件中,在这一行中,我们有名称或城市(在我的表中为空或空)然后批量插入更新并填写它们,否则跳过主键上的重复并为其他人插入。

这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

正如DoctorMick所说here

您可以将MAXERRORS属性设置为相当高的值,这将允许插入有效记录并忽略重复项。不幸的是,这意味着数据集中的任何其他错误都不会导致负载失败。

或者,您可以设置BATCHSIZE属性,该属性将在多个事务中加载数据,因此如果存在重复项,则只会回滚批处理。

或者

使用Temp表过滤Duplicate并更新它

INSERT INTO #tblProfile(Id, Col1) -- temporary table
VALUES 
(3, S3),
(4, S4),
(5, S5)

INSERT INTO tblProfile
SELECT * FROM #tblProfile
WHERE NOT EXISTS (SELECT Id FROM #tblProfile WHERE #tblProfile.Id = tblProfile.id)

;WITH cte
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY id
                                       ORDER BY ( SELECT 0)) RN
         FROM   #tblProfile)
DELETE FROM cte
WHERE  RN > 1

Update T 
SET T.Col1 = ISNULL(T1.Col1,T.Col1)
FROM tblProfile T join #tblProfile T1 ON T.id =T1.id