我使用批量插入方法从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文件中,在这一行中,我们有名称或城市(在我的表中为空或空)然后批量插入更新并填写它们,否则跳过主键上的重复并为其他人插入。
这样的事情可能吗?
答案 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