我将CSV文件批量导入临时表,然后将行插入目标表(如果它们尚不存在)。
当我开始这个过程时,我的表有以下值
VECH01 AAA 111
VECH01 BBB 222
VECH01 CCC 333
VECH02 AAA 111
VECH02 BBB 222
VECH02 CCC 333
当我导入包含以下值的CSV文件时:
VECH01 | DDD | 444
VECH01 | DDD | 555
VECH02 | CCC | XXX
导入第1行VECH01 DDD不在数据库中 好的
第二行已导入,但VECH01 DDD已在数据库中,它已在前一个插入中导入。
不行
由于VECH02 CCC已存在于数据库中,因此未导入第3行 好的
CREATE TABLE #csv
(
CarRedbookCode nvarchar(50) COLLATE Latin1_General_CI_AS,
AccessoryCode nvarchar(50) COLLATE Latin1_General_CI_AS,
AccessoryCodeAutoGeneral nvarchar(50) COLLATE Latin1_General_CI_AS
)
DECLARE @SqlStatement nvarchar(4000)
SET @SqlStatement =
'
BULK INSERT #csv
FROM ''' + @FileName + '''
WITH
(
FIELDTERMINATOR = ''|'',
ROWTERMINATOR = ''\n''
)
'
EXEC sp_executesql @SqlStatement
INSERT INTO MapRedbookAccessory (CarRedbookCodeAccessoryCode, CarRedbookCode, AccessoryCode, AccessoryCodeAutoGeneral)
select
src.CarRedbookCode + src.AccessoryCode
, src.CarRedbookCode
, src.AccessoryCode
, src.AccessoryCodeAutoGeneral
from
#csv src
left join
MapRedbookAccessory dst on dst.CarRedbookCodeAccessoryCode = src.CarRedbookCode + src.AccessoryCode
where
dst.CarRedbookCodeAccessoryCode is null
答案 0 :(得分:4)
这种情况正在发生,因为INSERT语句不会单独处理行。可能有更好的方法来执行此操作,但您可以使用ROW_NUMBER函数仅插入每个代码/附件的第一行:
INSERT INTO MapRedbookAccessory (CarRedbookCodeAccessoryCode, CarRedbookCode, AccessoryCode, AccessoryCodeAutoGeneral)
select
src.CarRedbookCode + src.AccessoryCode
, src.CarRedbookCode
, src.AccessoryCode
, src.AccessoryCodeAutoGeneral
from
(select *, ROW_NUMBER() OVER (PARTITION BY CarRedbookCode, AccessoryCode ORDER BY AccessoryCodeAutoGeneral) AS row
from #csv) src
left join
MapRedbookAccessory dst on dst.CarRedbookCodeAccessoryCode = src.CarRedbookCode + src.AccessoryCode
where
dst.CarRedbookCodeAccessoryCode is null
and src.row = 1
如果有多行,您可以更改ORDER BY
,具体取决于您要插入的AccessoryCodeAutoGeneral。
答案 1 :(得分:0)
在示例CSV导入数据中,两个DDD行后面会有不同的数值,这会使它们成为不同的行。所以VECH01 | DDD 应该插入两次。这是正确的,还是样本数据不正确?