次の方法で共有


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

適用対象:SQL ServerAzure SQL データベースAzure SQL Managed Instance Azure Synapse AnalyticsAnalytics Platform System (PDW)

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

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

  • 変換元とコピー先のデータが Unicode データ型でない場合、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 は、次の条件下で誤って解釈される可能性があります。

  • bcp ユーティリティが使用され、-w スイッチを使用して Unicode 文字を示す

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

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

特定の状況で次のいずれかの回避策を使用できるかどうかを検討します。

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

bcpBULK INSERT、または OPENROWSET を使用して、Unicode 文字形式データをテーブルにインポートできます。 bcp コマンドまたは BULK INSERT ステートメントの場合は、ステートメントでデータ形式を指定できます。 OPENROWSET ステートメントの場合は、フォーマット・ファイルでデータ形式を指定する必要があります。

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

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

また、フォーマット ファイルでフィールドごとに形式を指定することもできます。 詳細については、 データをインポートまたはエクスポートするフォーマット ファイル (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.fmtのスキーマに基づいて XML 以外のフォーマット ファイル (myWidechar) を生成します。 bcp コマンドを使用してフォーマット ファイルを作成するには、format引数を指定し、データ ファイル パスの代わりにnulを使用します。 書式オプションには、 -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

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

-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;

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