web-dev-qa-db-ja.com

CSVインポート操作の一部として、単一のステップでテーブルを作成してデータを入力するにはどうすればよいですか?

CSVファイルをSQLServerにインポートするための手っ取り早い方法を探しています事前にテーブルを作成してその列を定義する必要はありません

インポートされた各CSVは、独自のテーブルにインポートされます。

データ型推論については心配していません。 CSVは構造とレイアウトが異なり、すべてに多くの列がありますが、関心があるのは住所と郵便番号の一部だけです。 CSVデータをSQLデータベースにすばやく取得し、関連する列を抽出したいだけです。

FieldTerminatorとRowTerminatorを提供し、CSVをポイントして、残りはユーティリティに任せたいと思います。 BULK INSERTやOpenRowset(BULK ...)を使用して、テーブルを作成し、すべて1つのステップでデータを設定する方法はありますか?

17
Tim

SQLServerPediaを参照 、これは機能すると思います:

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

select TerritoryID
      ,TotalSales
      ,TotalCost
INTO CSVImportTable
from openrowset('MSDASQL'
               ,'Driver={Microsoft Access Text Driver (*.txt, *.csv)}'
               ,'select * from C:\csvtest.CSV')
11
TyT

迷惑なことに、コメントするだけの担当者ポイントがまだないので、TyTに基づいて回答を追加します(そのハンドルは所有格でひどいように見えます...)

「ファイルが見つかりません」というエラーを回避するために、ワーカーコードにはシングルではなくダブル「\」が必要でした。また、フィールドを指定する必要はありません。それらはファイルの最初の行から推測されます:

select *
into   CsvImportTable
from   openrowset(
           'MSDASQL',
           'Driver={Microsoft Access Text Driver (*.txt, *.csv)}',
           'select * from C:\\csvtestfile.csv')

Accessドライバーに問題はありませんでした。

更新:型が正しく推測されない場合は、ファイルの先頭に必要な型のデータを含む行を数行挿入して、テキスト-> INTの代わりにtext-> VARCHARと言ってください。インポート後にそれらの行を削除します。

最後のアイシングとして、データを操作できるようにテーブルにPKを追加します-ダミー行を削除します。

alter table CsvImportTable add Id int identity(1, 1)
8
SteveCinq

SQL Server Management Studio17を使用している場合の回答を更新しました。

データベースを右クリック->タスク->フラットファイルのインポート...

データの最初の行を列名として自動的に推測します。 shouldは自動的にターミネータをピックアップします。 nullを許可して主キーを設定し、列のデータ型も指定するオプションが表示されます。

0