bcpコマンドを利用すると、CSVファイルのデータをSQL Serverのテーブルに書き込めるが、その際に利用するCSVファイルの形式を、フォーマットファイルで指定することができる。また、フォーマットファイルを、bcpコマンドで自動生成することもできる。
今回は、bcpコマンドでフォーマットファイルを自動生成すると共に、生成したフォーマットファイルを利用してCSVファイルのデータをSQL Serverのテーブルに書き込んでみたので、その手順を共有する。
前提条件
下記記事のように、SQL Serverでbcpコマンドを利用できること。
やってみたこと
フォーマットファイルの作成
bcpコマンドを利用すると、SQL Serverのテーブルに書き込むためのフォーマットファイルを自動生成できる。その手順は、以下の通り。
なお、フォーマットファイルの形式は、XML形式とXML形式以外の2通りがあるが、今回はXML形式でフォーマットファイルを作成するものとする。
1) create table文を利用して、employeeテーブルを作成する。
create table dbo.employee (
emp_id int not null primary key
, emp_name nvarchar(40) not null
, memo nvarchar(120)
, create_user varchar(40)
, create_date datetime
, update_user varchar(40)
, update_date datetime
)
2) コマンドプロンプトを起動し、bcpコマンドの配置されているディレクトリに移動する。
cd C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn dir

3) bcpコマンドを利用して、XML形式のフォーマットファイルを作成する。
bcp dbo.employee format nul -c -x -f "C:\tmp\employee.xml"
-t , -S localhost -U USER01 -P USER01 -d master
なお、bcpコマンドは、「bcp (テーブル名) format nul -c -x -f (フォーマットファイルパス(XML形式)) -t(区切り文字) -S (ホスト名) -U (ユーザー名) -P (パスワード) -d (データベース名)」という形式で指定している。
また、オプション「-x」を指定することで、作成されるフォーマットファイルがXML形式になる。

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="12"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="80"
COLLATION="Japanese_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="240"
COLLATION="Japanese_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="40"
COLLATION="Japanese_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="24"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="40"
COLLATION="Japanese_CI_AS"/>
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="24"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="emp_id" xsi:type="SQLINT"/>
<COLUMN SOURCE="2" NAME="emp_name" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="memo" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="create_user" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="5" NAME="create_date" xsi:type="SQLDATETIME"/>
<COLUMN SOURCE="6" NAME="update_user" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="7" NAME="update_date" xsi:type="SQLDATETIME"/>
</ROW>
</BCPFORMAT>
フォーマットファイルを利用したCSVインポート
bcpコマンドを利用すると、CSVファイルのデータをSQL Serverのテーブルに書き込めるが、その際にフォーマットファイルを利用することもできる。その手順は、以下の通り。
1) インポートする予定のCSVファイルの内容は、以下の通り。

2) employeeテーブルに、カラム「new_col」を追加する。
ALTER TABLE dbo.employee ADD new_col VARCHAR(20)

3) インポートする前のemployeeテーブルのデータは、以下の通り。
SELECT * FROM dbo.employee

4)「C:\tmp」フォルダ下に、フォーマットファイルとインポートする予定のファイルを配置する。

5) コマンドプロンプトを起動し、bcpコマンドの配置されているディレクトリに移動する。
cd C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn

6) bcpコマンドでXML形式のフォーマットファイルを利用して、CSVファイルのデータをemployeeテーブルに追加する。
bcp dbo.employee in "C:\tmp\employee_in.csv"
-f "C:\tmp\employee.xml" -S localhost -U USER01 -P USER01 -d master
なお、bcpコマンドは、「bcp (テーブル名) in (インポートするCSVファイル名) -f (フォーマットファイルパス(XML形式)) -S (ホスト名) -U (ユーザー名) -P (パスワード) -d (データベース名)」という形式で指定している。
7) インポートした後のemployeeテーブルのデータは、以下の通り。
SELECT * FROM dbo.employee

要点まとめ
- bcpコマンドを利用すると、CSVファイルのデータをSQL Serverのテーブルに書き込めるが、その際に利用するCSVファイルの形式を、フォーマットファイルで指定することができる。また、フォーマットファイルを、bcpコマンドで自動生成することもできる。







