从临时表插入 - 创建太多行

时间:2010-10-12 23:49:25

标签: sql-server sql-server-2005 tsql

我将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

2 个答案:

答案 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 应该插入两次。这是正确的,还是样本数据不正确?