1. ホーム
  2. データベース
  3. mssql2005

SQL Server のテーブルに CSV ファイルをインポートする方法

2022-01-20 15:32:23

レポート分析をするときなど、CSVからデータベースのテーブルにデータを取り込むことがあります。
この問題に関しては、プログラマーに勝つのは全く難しいことではないと思います でも、SQL Serverでこんなことができたらいいと思いませんか!?
はい、SQL Serverにはその機能があります。

まず、CSVファイルを見てみましょう。D:ドライブの下にcsv.txtという名前で保存されており、次のような内容になっています。


さて、肝心のSQL Serverですが。

SQL Server の BULK INSERT コマンドを使用しています。コマンドの詳細な説明は、ここをクリックしてください。
まず、この情報を保持するために使用するデータのテーブルをSQL Serverに作成することから始めます。

CREATE TABLE CSVTable(
 Name NVARCHAR(MAX),
 Email NVARCHAR(MAX),
 Area NVARCHAR(MAX)
)

そして、次のような文が実行されます。

BULK INSERT CSVTable
FROM 'D:\csv.txt'
WITH(
 FIELDTERMINATOR = ',',
 ROWTERMINATOR = '\n'
)
SELECT * FROM CSVTable

F5キーを押すと、実行結果は次のようになります。

どうですか?プログラムを使うより簡単だと思いませんか!?

しかし、今度はいくつかの問題が出てきます。

1、CSVファイルには、二重引用符で囲まれている列の値と、二重引用符で囲まれていない列の値があります。


上記のステートメントをもう一度実行すると、前回とは異なる結果が得られます。

これらの列の中には、二重引用符が含まれているものがあり、これは私たちが望む結果ではないはずです。この問題を解決するには、一時テーブルを使用し、CSVを一時テーブルにインポートし、この一時テーブルから最終テーブルにインポートする際に二重引用符を削除する必要があります。

2、CSVファイルのカラム値がすべて二重引用符で囲まれている。


この問題は、前の問題より少し複雑です。CSVファイルをtempテーブルに最初にインポートすることに加えて、以下の場合にCSVファイルをtempテーブルにインポートするために使用されるコードを修正する必要があります。


丸で囲った部分に注目してください。

3、CSVファイルはデータテーブルのカラムよりも多くのカラムを持つ必要があります。

そして、データテーブルには3つのカラムしかありませんが、上記のインポートコードを実行すると、どのような結果になるでしょうか。

その結果、次のようになります。


これは後者をすべてAreaの列に入れるものです。これに対処するには、実はとても簡単で、つまり、データテーブルに欲しい列の値を順番に作り、不要な列の値は、データテーブルにも列を作り、一時的な列だけにして、このデータテーブルを最終テーブルにインポートするときに、この一時的な列を無視すればいいのです。