2016-06-27 83 views
0

CSVファイルから行を挿入するために一括挿入メソッドを使用しています。しかし、重複した主キーでは失敗します。私は重複する主キーの列のフィールドを更新する必要がバルク挿入時に重複した主キーを持つ行をスキップするか、SQLをスキップする

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 

行がCSVファイルにし、この行のコード「68」であった場合、我々は(名前や都市を持っているに空またはnullであります私のテーブル)、一括更新を挿入し、それ以外の場合は主キーでこの複製をスキップし、他の人に挿入します。

これは可能でしょうか?

+0

を更新するには、あなたがこれを行うために使用しているコードを投稿することができますか? –

答えて

1

DoctorMickはあなたが有効なレコードを挿入すると重複が無視されることを可能にするであろう、非常に高いにMAXERRORSプロパティを設定することができhere

を述べたように。残念ながら、これは、データセット内の他のエラーが原因でロードが失敗しないことを意味します。

また、複数のトランザクションでデータをロードするBATCHSIZEプロパティを設定することができます。重複がある場合は、バッチのみをロールバックします。

それとも

使用の一時テーブルの重複をフィルタリングし、それを

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 
+0

私はそれを見ましたが、必要に応じて重複した行を更新する方法を教えていません! – Nofuzy

+0

更新する場合は、プライマリキーなしですべてのデータを一時テーブルに挿入し、一時テーブルからメインテーブルへの更新を使用する必要があります –

+0

どのようにですか?あなたは私を見せてくれますか?私はC#とSQLの一括コピーも使用することができますが必要です。 – Nofuzy

関連する問題