ぱそくま ろご
Windows > SQL Server > BULK INSERTの便利な使い方(UTF8とかID列とか)

BULK INSERTの便利な使い方(UTF8とかID列とか)

BULK INSERTでUTF-8とか

CODEPAGEオプションを使えば、BULK INSERTはShift JIS以外の文字コードのデータフィルを読むことができます。 ただし、読み込むデータファイルの文字コードにUTF-8は対応していないようです。

なお、DATAFILETYPEオプションを使えばNCHARやNVARCHAR列に取込むとき、UNICODEに変換して保存してくれますので、 取込むファイルの文字コードを気にする必要はありません。 どんな文字コードのファイルをBLUK INSERTしても、SQLServer内では「UNICODE」で保持されます。

例えば、以下のような要件の場合は、

ファイル等の文字コード
データファイル Shift JIS
挿入先のテーブル
  • CREATE TABLE dbo.MEMBER_INFO
  • (
  •  MAIL_ADDR VARCHAR(50) NOT NULL,
  •  NAME_MEI NVARCHAR(50) NOT NULL,
  •  NAME_SEI NVARCHAR(50) NOT NULL,
  •  CONSTRAINT PK_MEMBER_INFO PRIMARY KEY CLUSTERED (MAIL_ADDR)
  • ) ON [PRIMARY]
WEBページの文字コード UTF-8

以下のようなBULK INSERT文になります。

  • BULK INSERT pasodb.dbo.MEMBER_INFO
  • FROM 'D:\data\member.csv'
  • WITH
  • (
  • FIRSTROW = 2,
  • FIELDTERMINATOR = ',',
  • CHECK_CONSTRAINTS,
  • DATAFILETYPE='widechar'
  • )

なお、WEBページ上での表示はSQLドライバーの問題ですので、適切にドライバーを使えば、問題なくUTF-8で表示できます。



ID(IDENTITY)列を持つテーブルにBULK INSERT

ID(IDENTITY)列を持つテーブルにBULK INSERTを単純に行うとファイルのID列に該当するフィールドの値は無視され、SQLServerが自動付与します。 これはデータファイルにある値より、内部のオートインクリメントを優先するためです。 下記に例を示します。

ID列を持つテーブルにBULK INSERTの例
挿入先のテーブル
  • CREATE TABLE dbo.MEMBER_INFO
  • (
  •  MEMBER_ID INT IDENTITY(1,1) NOT NULL,
  •  MAIL_ADDR VARCHAR(50) NOT NULL,
  •  NAME_MEI VARCHAR(50) NOT NULL,
  •  NAME_SEI VARCHAR(50) NOT NULL,
  •  CONSTRAINT PK_MEMBER_INFO PRIMARY KEY CLUSTERED (MAIL_ADDR)
  • ) ON [PRIMARY]
CSVの中身
  • ID,メールアドレス,名前(姓),名前(名)
  • 11,tarou@hoge.com,てすと,太郎
  • 24,hanako@hoge.com,てすと,花子
  • 25,jirou@hoge.com,てすと,次郎
  • .
  • .
MEMBER_INFOテーブルにBULK INSERTを使ってCSVファイルをインポート
  • BULK INSERT pasodb.dbo.MEMBER_INFO
  • FROM 'D:\data\member.csv'
  • WITH
  • (
  • FIRSTROW = 2,
  • FIELDTERMINATOR = ',',
  • CHECK_CONSTRAINTS
  • )
結果(SELECT * FROM MEMBER_INFO)

CSVファイルのID列の値は無視され、自動で採番される。

  • # SELECT * FROM MEMBER_INFO
  • 1,tarou@hoge.com,てすと,太郎
  • 2,hanako@hoge.com,てすと,花子
  • 3,jirou@hoge.com,てすと,次郎
  • .
  • .

ID列の値をそのまま使用した(挿入したい)場合は、「KEEPIDENTITY」オプションを使います。

ID列の値を保持するBULK INSERTの例
KEEPIDENTITYを使ったBULK INSERT
  • BULK INSERT pasodb.dbo.MEMBER_INFO
  • FROM 'D:\data\member.csv'
  • WITH
  • (
  • FIRSTROW = 2,
  • FIELDTERMINATOR = ',',
  • CHECK_CONSTRAINTS,
  • KEEPIDENTITY
  • )
結果(SELECT * FROM MEMBER_INFO)
  • # SELECT * FROM MEMBER_INFO
  • 11,tarou@hoge.com,てすと,太郎
  • 24,hanako@hoge.com,てすと,花子
  • 25,jirou@hoge.com,てすと,次郎
  • .
  • .