Insérer dans la table temporaire – créer trop de lignes

Je suis en train d'importer en bloc le file CSV dans une table temporaire, puis d'insert les lignes dans la table cible si elles n'existent pas déjà.

Quand je commence le process, ma table a les valeurs suivantes

VECH01 AAA 111
VECH01 BBB 222
VECH01 CCC 333
VECH02 AAA 111
VECH02 BBB 222
VECH02 CCC 333

Lorsque j'importe un file CSV avec ces valeurs:

VECH01 | DDD | 444
VECH01 | DDD | 555
VECH02 | CCC | XXX

La 1ère ligne est imscope VECH01 DDD n'est pas dans la database.
D'accord

La 2ème ligne est imscope mais VECH01 DDD est déjà dans la database, elle a été imscope dans l'insertion précédente.
PAS D'ACCORD

La 3ème ligne n'est pas imscope car VECH02 CCC existe déjà dans la database.
D'accord

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 

Cela se produit car l'instruction INSERT ne traite pas les lignes individuellement. Il existe peut-être une meilleure méthode pour cela, mais vous pouvez utiliser la fonction ROW_NUMBER pour insert uniquement la première ligne pour chaque code / accessoire:

 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 

Vous pouvez modifier ORDER BY fonction du AccessoryCodeAutoGeneral que vous souhaitez insert s'il y a plusieurs lignes.

Dans datatables d'import CSV de votre exemple, les deux lignes DDD ont des valeurs numériques différentes qui les rendent différentes. Donc VECH01 | DDD devrait être inséré deux fois. Est-ce exact ou datatables de l'échantillon sont-elles incorrectes?