SQL Server on Linux へ Windows環境の Microsoft SQL Server Management Studio から BULK INSERT でデータ登録する

Published on

背景

Windows Server の Hyper-V に Ubuntu 18.4 LTS と SQL Server 2019 Express の環境を構築。ここに Windows 10 のクライアントから 別途 DHW 等で取得した Shift-JIS の CSV ファイルを BULK INSERT で取り込みたかったので、動作時の記録です。

昔の環境であり、サポート切れとなっていますが、情報として残しておきます。
照合順序を Japanese_XJIS_140_CI_AS_UTF8 等に設定しても、下記の SQL Server on Linux 環境では UTF-8 のファイルを BULK INSERT できませんでした。

環境

登録先のサーバ

  • Ubuntu 18.4 LTS ( Hyper-V 仮想マシン )
  • Microsoft SQL Server Express (64-bit)
    • サーバーのプロパティ / サーバーの照合順序 : Japanese_CI_AS
    • サーバーのプロパティ / バージョン : 15.0.4198.2
    • サーバーのプロパティ / 言語 : 日本語
    • データベースのプロパティ / 全般 / 照合順序 : Japanese_CI_AS
    • データベースのプロパティ / オプション / 既定の言語 : Japanese
    • 列のプロパティ / 全般 / データ型 : nvarchar
    • 列のプロパティ / 全般 / 照合順序 : Japanese_CI_AS

クライアント

  • Windows 10 22H2
  • Microsoft SQL Server Management System 20.2.30.0
  • nkf 2.1.1.1
  • WinSCP 5.17.10

手順

1. 変換作業フォルダ(workdir)の構成

└─ workdir  
  ├─ nkf.exe  
  └─ Shift-JISのファイル.csv

2. nkf を使用してUTF16LE BOM有へ変換

cd workdir
nkf --ic=cp932 --oc=UTF-16LE-BOM "Shift-JISのファイル.csv" > "UTF16LEBOMのファイル.csv"

nkf( Network Kanji Filter )の各オプション

  • —ic=cp932: 入力をCP932(Microsoft の Shift-JIS実装)として扱う
  • —oc=UTF-16LE-BOM: 出力をBOM付きUTF-16LE(Windowsで一般的)に変換
  • “Shift-JISのファイル.csv”: 入力ファイル
  • >: 出力のリダイレクト
  • “UTF16LEBOMのファイル.csv”: 出力ファイル

※nkf -w16L で変換すると、全角チルダ(~)とかがうまく変換できなくてエラーになる

3. 変換後の作業フォルダの構成

└─ workdir  
  ├─ nkf.exe  
  ├─ Shift-JISのファイル.csv
  └─ UTF16LEBOMのファイル.csv

4. WinSCPを使用してサーバーに変換後のCSVファイルを移動させる

サーバーにさえファイルが移せれば何を使っても問題ないです。

5. Windwos の Microsoft SQL Server Management System で BULK INSERT を実行

  BULK
INSERT [テーブル名]
  FROM 'サーバーのCSVファイルパス'
  WITH
     ( DATAFILETYPE = 'widechar'
     , FORMAT = 'CSV'
     , ROWTERMINATOR = '\r\n'
     , FIRSTROW = 2
     )
  • DATAFILETYPE = ‘widechar’: UTF-16形式のファイルを読み込む
  • FORMAT = ‘CSV’: CSVファイル形式として処理
  • ROWTERMINATOR = ‘\r\n’: 改行コードはCRLF
  • FIRSTROW = 2: 2行目からデータとして取り込む(1行目はヘッダー行)