2012-02-23 14 views
1

重複したレコードを含む毎日のCSVを受信しました。 BULK INSERTを使用してインポートしようとしましたが、重複が原因でプライマリキーの制約が原因でエラーが発生します。SQL Server 2008で異なるレコードをインポート

INSERT INTO final_table(col1, col2, col3) 
SELECT DISTINCT col1, col2, col3 
FROM temporary_table 

がこのついて行くの最善の方法です。この問題を解決するには

、ノー主キー制約を持つ新しいテーブルにデータをインポートし、次のコードを使用して考えていますか?または、SQL Server 2008でこれを行う簡単な方法はありますか?

+0

あなたは重複をどうしたいですか?それらを削除するか無視するか? –

+0

私はインデックスにインデックスを付けずにテーブルにBCP'ingして、それに応じてIGNORE_DUP_KEYを設定してインデックスを追加することをお勧めします。 –

+0

完全に削除したいのですが。ステージングテーブルの方法は今のところ動作しているようです。ありがとう! – eek142

答えて

2

この新しい「テーブル」はステージングテーブルと呼ばれます。それにはほとんど限界がありません。制約。そこにロードされると、あなたは "最後の"テーブルにスクラブしてロードします。

あなたが提案していることは最も簡単だと思います。 SSISを使用していて、ステージングテーブルを使用しないことを強くお勧めしている場合を除きます。私はステージングテーブルを周りに置くのが好きなので、何かがうまくいかない場合は、ファイルの正確なレプリカを見ることができます。トラブルシューティングに役立ちます。

+0

ステージングテーブルを実際のテーブルにする必要がありますか、またはテンポラリテーブルを使用できますか? – eek142

+0

技術的には#tmpテーブルはtempdbに存在するテーブルです。しかし、それはセッション固有なので、一括挿入の前に "テーブル#tmpを作成"することができます。 –

+0

私は通常、自分のETLプロセスで持続するステージングテーブルを持っているのが好きです。ちょうど私は生データにアクセスできます。しかし、このシナリオでは重複を取り除こうとしているので、それほど重要ではありません。 –

1

これを試してみてください:

INSERT INTO final_table 
SELECT DISTINCT csv.* 
FROM OPENROWSET(BULK N'C:\Text1.csv', SINGLE_CLOB) AS csv 
+0

次のエラーが表示されます。 INSERT文の選択リストには、挿入リストよりも少ない項目が含まれています。これは一般的なアプローチです(MySQL、PostGres、DB2、SQL Serverでこれを行います)。 SELECT値の数は、INSERT列の数と一致する必要があります。 私は次のコードを実行しようとすると、次のとおりです。final_table(COL1、COL2、COL3)INTO INSERTはDISTINCT csvファイルを選択 * OPENROWSET(BULKのN'C:\ Text1.csv」、SINGLE_CLOB)FROM。CSV AS カンマ区切り記号をCSVのどこかに記述する必要がありますか? – eek142

+0

私はあなたが理解できる方法でコードを書いた、あなたはfinal_tableのテーブル定義に一致する選択の列を指定する必要があります。 – pistipanko

+0

"csv"テーブルの列をどのように定義できますか?ファイルから直接挿入していませんか? final_table(col1、col2、col3)のようにfinal_tableの列を指定しました – eek142

関連する問題