はじめに
弊社では、DBの一部にSQL Serverを使用しています。
開発時に大量データの登録を一括で行う場合におすすめしたいBULK INSERTについてご紹介したいと思います。
BULK INSERTとは
CSV形式などの形式で、テーブルに一括でデータを登録できるコマンドです。
MicrosoftのSQLドキュメントのBULK INSERTのリンク
データ登録してみる
まずBULK INSERTがどんなものかを知るために、簡易的なテーブルにデータ登録してみます。
利用するテーブル
| 説明 | カラム名 | 型 | 
|---|---|---|
| ID | ID | int | 
| 名前 | Name | nvarchar(50) | 
| 体重 | Weight | int | 
| 身長 | Height | int | 
| データ登録日 | RegistDT | datetime | 
CREATE TABLE [dbo].[User](
	[Id] [int] NULL,
	[Name] [nvarchar](50) NULL,
	[Weight] [int] NULL,
	[Height] [int] NULL,
	[RegistDT] [datetime] NULL
) ON [PRIMARY]
登録データ
ヘッダー行は不要のため1行目から登録データを記述し、ここではセパレータは半角カンマ(,)を利用します。なおデータ内に半角カンマ(,)が含まれている場合のエスケープ方法は分かりませんでしたので、セパレータにはタブ(\t)を利用してみてください。
1,pique,80,194,2019/08/19 8:01:59
2,messi,72,170,2019/08/19 8:01:59
3,suarez,86,182,2019/08/19 8:01:59
MSサイトではヘッダーについてこのように記載されています。
※FIRSTROW=2を指定することで対処可能だったりもします。
ヘッダーのスキップは、BULK INSERT ステートメントではサポートされません。
BULK INSERTクエリ
テーブルと登録データの準備が整ったので、BULK INSERTしてみます。
BULK INSERT [User]
FROM 'C:\work\BULK_INSERT_USER.txt'
WITH 
	(
		FIELDTERMINATOR =','
	)
--BULK INSERT結果確認
SELECT * FROM [User] WITH (NOLOCK) 
オプション引数
上記ではオプション引数はFIELDTERMINATORのみ利用ましたが、いくつかご紹介します。
| 名称 | 説明 | 
|---|---|
| FIELDTERMINATOR | セパレータを指定します。 半角カンマ(,)やタブ(\t)などで、規定値はタブ(\t)です。 | 
| DATAFILETYPE | 登録データの型に応じて'char','native','widechar','widenative'のいずれかを指定します。既定値は'char'です。詳細はこちらを参照。 | 
| KEEPIDENTITY | ID(IDENTITY)列がある場合に指定することで、自動発番を無視して登録データの値で登録します。 | 
| KEEPNULLS | 登録データ上にNULLが存在する場合に指定し、NULLは削除します。詳細はこちらを参照 | 
| ROWTERMINATOR | 行の終端セパレーターを指定します。LFの場合は'0x0A'を指定します。詳細はこちらを参照 | 
サンプル
私が利用しているBULK INSERTクエリのサンプルをご紹介します。
このサンプルでは、テスト用にBEGIN TRANコマンドで検証し、ID(IDENTITY)列を無視してデータを登録を行います。
SELECT COUNT(*) FROM [User] WITH (NOLOCK) --BULK INSERT前の件数
BEGIN TRAN BULK_INSERT_USER
BULK INSERT [User]
FROM 'C:\work\BULK_INSERT_USER.txt'
WITH 
	(
		FIELDTERMINATOR =',' 
		,KEEPIDENTITY --自動発番を無視する場合には指定
	) 
ROLLBACK TRAN BULK_INSERT_USER --テスト時に利用するためロールバックする
--COMMIT TRAN BULK_INSERT_USER
SELECT COUNT(*) FROM [User] WITH (NOLOCK) --BULK INSERT後の件数
最後に
データ登録作業は頻繁に行う作業ではないため、いざ作業をしようと思うとオプションを忘れていたり、BULK INSERTコマンドのエラーメッセージが分かりづらかったりと、思うように作業が進まないことがありまとめました。少しでも皆さんの作業が楽になれば何よりです。
