Unicode 文字形式を使用したデータのインポートまたはエクスポート (SQL Server)

適用対象:yesSQL Server (サポートされているすべてのバージョン) Yes Azure SQL Database Yes azure SQL Managed Instance yes azure Synapse analytics yes analytics Platform System (PDW)

拡張文字や DBCS 文字を含むデータファイルを使用して SQL Server の複数のインスタンス間でデータを一括転送する場合は、Unicode 文字形式を使用することをお勧めします。 Unicode 文字データ形式を使用すると、操作を実行するクライアントで使用しているコード ページとは異なるコード ページを使用して、サーバーからデータをエクスポートできます。 このような場合、Unicode 文字形式を使用すると、次の利点があります。

  • 転送元のデータと転送先のデータが Unicode データ型の場合、Unicode 文字形式を使用するとすべての文字データが保持されます。

  • 転送元のデータと転送先のデータが Unicode 以外のデータ型の場合、Unicode 文字形式を使用すると、転送先のデータで表現できない転送元のデータに含まれる拡張文字の損失を最小限に抑えられます。

このトピックの内容
Unicode 文字形式の使用に関する注意点
Unicode 文字形式、bcp、フォーマット ファイルの使用に関する特別な注意点
Unicode 文字形式のコマンド オプション
テスト条件の例
 ● サンプルテーブル
 ● XML 以外のフォーマットファイルのサンプル
使用例
 ● Bcp と Unicode 文字形式を使用したデータのエクスポート
 ● フォーマットファイルなしで bcp と Unicode 文字形式を使用してデータをインポートする方法
 ● Bcp と Unicode 文字形式を使用して XML 以外のフォーマットファイルを使用してデータをインポートする方法
 ● フォーマットファイルなしで BULK INSERT と Unicode 文字形式を使用する
 ● XML 形式以外のフォーマットファイルで BULK INSERT と Unicode 文字形式を使用する方法
 ● XML 形式以外のフォーマットファイルで OPENROWSET と Unicode 文字形式を使用する方法
関連タスク

Unicode 文字形式の使用に関する注意点

Unicode 文字形式を使用するときは、以下の点をご考慮ください。

Unicode 文字形式、bcp、フォーマット ファイルの使用に関する特別な注意点

Unicode 文字形式のデータ ファイルは、Unicode ファイルの規則に従います。 ファイルの先頭の 2 バイトは、16 進数の 0xFFFE です。 これらのバイトは、バイト順マーク (BOM) としての役割を果たし、高位のバイトをファイルの先頭に格納するか、最後に格納するかを指定します。 bcp ユーティリティ が BOM の解釈を間違えてインポート プロセスの一部が失敗し、次のようなエラー メッセージが表示される場合があります。

Starting copy...
SQLState = 22005, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Invalid character value for cast specification

次の条件下で BOM の解釈を間違える可能性があります。

  • cp ユーティリティ を使用しており、 -w スイッチを使用して Unicode 文字を指定している

  • フォーマット ファイルを使用している

  • データ ファイルの最初のフィールドが文字以外である

特定の 状況に次の回避策のいずれかを使用できるかどうかご検討ください。

Unicode 文字形式のコマンド オプション

Unicode 文字形式のデータは、 bcpBULK INSERT または INSERT...SELECT * FROM OPENROWSET (BULK...)Bcp コマンドまたは BULK INSERT ステートメントの場合は、ステートメントでデータ形式を指定できます。 INSERT ...SELECT * FROM OPENROWSET(BULK...) ステートメントの場合は、フォーマット ファイルでデータ形式を指定する必要があります。

Unicode 文字形式は、次のコマンド オプションでサポートされています。

command オプション 説明
bcp -w Unicode 文字形式を使用します。
BULK INSERT DATAFILETYPE ='widechar' データの一括インポート時に Unicode 文字形式を使用します。
OPENROWSET 該当なし フォーマット ファイルを使用する必要があります

Note

また、フォーマット ファイルでフィールドごとに形式を指定することもできます。 詳細については、「データのインポートまたはエクスポート用のフォーマットファイル (SQL Server)」を参照してください。

テスト条件の例

このトピックの例は、以下に定義されたテーブルとフォーマット ファイルに基づいています。

サンプルテーブル

次のスクリプトは、 myWidechar という名前のテーブルのテスト データベースを作成し、テーブルにいくつかの初期値を設定します。 Microsoft SQL Server Management Studio (SSMS) で、次の Transact SQL を実行します。

CREATE DATABASE TestDatabase;
GO

USE TestDatabase;
CREATE TABLE dbo.myWidechar ( 
	PersonID smallint NOT NULL,
	FirstName nvarchar(25) NOT NULL,
	LastName nvarchar(30) NOT NULL,
	BirthDate date,
	AnnualSalary money
);

-- Populate table
INSERT TestDatabase.dbo.myWidechar
VALUES 
(1, N'ϴAnthony', N'Grosse', '02-23-1980', 65000.00),
(2, N'❤Alica', N'Fatnowna', '11-14-1963', 45000.00),
(3, N'☎Stella', N'Rossenhain', '03-02-1992', 120000.00);

-- Review Data
SELECT * FROM TestDatabase.dbo.myWidechar;

XML 以外のフォーマットファイルのサンプル

SQL Server は、非 XML 形式と XML 形式の 2 種類のフォーマット ファイルをサポートしています。 XML 以外のフォーマットとは、以前のバージョンの SQL Server でサポートされる従来のフォーマットです。 詳細については、「 XML 以外のフォーマット ファイル (SQL Server) 」を参照してください。 次のコマンドは、 bcp ユーティリティを使用して、の myWidechar スキーマに基づいて xml 以外のフォーマットファイル を生成します。 bcp コマンドを使用してフォーマット ファイルを作成するには、 format 引数を指定し、データ ファイルのパスの代わりに nul を使用します。 format オプションには、次に示す -f オプションが必要です。 さらに、この例では、修飾子 c を使用して文字データを指定し、 T を使用して統合セキュリティによる信頼関係接続を指定します。 コマンド プロンプトで、次のコマンドを入力します。

bcp TestDatabase.dbo.myWidechar format nul -f D:\BCP\myWidechar.fmt -T -w

REM Review file
Notepad D:\BCP\myWidechar.fmt

重要

XML 以外のフォーマット ファイルは、キャリッジ リターン\ライン フィードで終わるようにします。 そうしないと、次のエラー メッセージが発生する可能性があります。

SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]I/O error while reading BCP format file

使用例

次の例では、上記で作成したデータベースとフォーマット ファイルを使用します。

Bcp と Unicode 文字形式を使用したデータのエクスポート

-w スイッチと OUT コマンドです。 注: この例で作成するデータ ファイルをその後のすべての例で使用します。 コマンド プロンプトで、次のコマンドを入力します。

bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w

REM Review results
NOTEPAD D:\BCP\myWidechar.bcp

フォーマットファイルなしで bcp と Unicode 文字形式を使用してデータをインポートする方法

-w スイッチと IN コマンドです。 コマンド プロンプトで、次のコマンドを入力します。

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"

REM Import data
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -T -w

REM Review results is SSMS

XML 形式以外のフォーマットファイルで bcp と Unicode 文字形式を使用してデータをインポートする方法

-w および -f スイッチと IN コマンドです。 この例は bcp、フォーマット ファイル、Unicode 文字を使用し、かつデータ ファイル内の最初のデータ フィールドが文字でないため、回避策を実行する必要があります。 上記の「 Unicode 文字形式、bcp、フォーマット ファイルの使用に関する特別な注意点」をご覧ください。 データファイル myWidechar.bcp は、"ダミー" レコードとして追加のレコードを追加することによって変更され、その後スイッチで -F 2 スキップされます。

コマンド プロンプトで次のコマンドを入力し、変更手順を実行します。

REM Truncate table (for testing)
SQLCMD -Q "TRUNCATE TABLE TestDatabase.dbo.myWidechar;"

REM Open data file
Notepad D:\BCP\myWidechar.bcp
REM Copy first record and then paste as new first record.  This additional record is the "dummy" record.
REM Close file.

REM Import data instructing bcp to skip dummy record with the -F 2 switch.
bcp TestDatabase.dbo.myWidechar IN D:\BCP\myWidechar.bcp -f D:\BCP\myWidechar.fmt -T -F 2

REM Review results is SSMS

REM Return data file to original state for usage in other examples
bcp TestDatabase.dbo.myWidechar OUT D:\BCP\myWidechar.bcp -T -w

フォーマットファイルなしで BULK INSERT と Unicode 文字形式を使用する方法

DATAFILETYPE 引数です。 Microsoft SQL Server Management Studio (SSMS) で、次の Transact SQL を実行します。

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar
	FROM 'D:\BCP\myWidechar.bcp'
	WITH (
		DATAFILETYPE = 'widechar'
		);

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

XML 形式以外のフォーマットファイルで BULK INSERT と Unicode 文字形式を使用する方法

FORMATFILE 引数。 Microsoft SQL Server Management Studio (SSMS) で、次の Transact SQL を実行します。

TRUNCATE TABLE TestDatabase.dbo.myWidechar; -- for testing
BULK INSERT TestDatabase.dbo.myWidechar
   FROM 'D:\BCP\myWidechar.bcp'
   WITH (
		FORMATFILE = 'D:\BCP\myWidechar.fmt'
		);

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

XML 形式以外のフォーマットファイルで OPENROWSET と Unicode 文字形式を使用する方法

FORMATFILE 引数。 Microsoft SQL Server Management Studio (SSMS) で、次の Transact SQL を実行します。

TRUNCATE TABLE TestDatabase.dbo.myWidechar;  -- for testing
INSERT INTO TestDatabase.dbo.myWidechar
	SELECT *
	FROM OPENROWSET (
		BULK 'D:\BCP\myWidechar.bcp', 
		FORMATFILE = 'D:\BCP\myWidechar.fmt'  
		) AS t1;

-- review results
SELECT * FROM TestDatabase.dbo.myWidechar;

一括インポートまたは一括エクスポートのデータ形式を使用するには

参照

bcp ユーティリティ
BULK INSERT (Transact-SQL)
OPENROWSET (Transact-SQL)
データ型 (Transact-SQL)
照合順序と Unicode のサポート