適用対象:SQL Server
Azure SQL データベース
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
拡張文字や DBCS 文字を含むデータ ファイルを使用して SQL Server の複数のインスタンス間でデータを一括転送する場合は、Unicode 文字書式を使用することをお勧めします。 Unicode 文字データ形式を使用すると、操作を実行しているクライアントで使用されるコード ページとは異なるコード ページを使用して、サーバーからデータをエクスポートできます。 このような場合、Unicode 文字形式を使用すると、次の利点があります。
転送元のデータと転送先のデータが Unicode データ型の場合、Unicode 文字形式を使用するとすべての文字データが保持されます。
変換元とコピー先のデータが Unicode データ型でない場合、Unicode 文字形式を使用すると、コピー先で表現できない変換元データの拡張文字の損失が最小限に抑えられます。
Unicode 文字形式の使用に関する考慮事項
Unicode 文字形式を使用する場合は、次の点を考慮してください。
既定では、 bcp ユーティリティ は、文字データ フィールド間の区切りにはタブ文字を、レコードの終わりには改行文字を使用します。 代替ターミネータを指定する方法については、「 フィールドターミネータと行ターミネータの指定 (SQL Server)」を参照してください。
Unicode 文字形式のデータ ファイルに格納されている sql_variant データの動作は、 char データではなく nchar データとして格納されている点を除いて、文字形式のデータ ファイルの場合と同様になります。 文字形式の詳細については、「 照合順序と 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 文字を示すフォーマット ファイルを使用している
データ ファイルの最初のフィールドが文字以外である
特定の状況で次のいずれかの回避策を使用できるかどうかを検討します。
フォーマット ファイルを使用しないでください。 この回避策の例は、「 フォーマット ファイルを使用せずに bcp および Unicode 文字形式を使用してデータをインポートする」で提供されています。
-c
の代わりに-w
スイッチを使用します。ネイティブ形式を使用して、データをもう一度エクスポートします。
BULK INSERT (Transact-SQL) または OPENROWSET (Transact-SQL) を使用します。 これらの回避策の例は、「 XML 以外のフォーマット ファイルでの BULK INSERT および Unicode 文字形式の使用 」および「XML 以外のフォーマット ファイルでの OPENROWSET および Unicode 文字形式の使用 」セクションで提供されています。
宛先テーブルに最初のレコードを手動で挿入してから、
-F 2
スイッチを使用して、2 番目のレコードでインポートを開始します。ダミーの最初のレコードをデータ ファイルに手動で挿入した後、
-F 2
スイッチを使用して、2 番目のレコードでインポートを開始します。 この回避策の例は、「 XML 以外のフォーマット ファイルを使用してデータをインポートする bcp と Unicode 文字形式を使用する 」セクションで提供されています。最初の列が文字データ型のステージング テーブルを使用します。
データを再エクスポートし、最初のデータ フィールドが文字になるようにデータ フィールドの順序を変更します。 その後、フォーマット ファイルを使用して、データ フィールドをテーブルの実際の順序にもう一度マッピングします。 例については、「 フォーマット ファイルを使用してテーブル列をデータ ファイル フィールドにマップする (SQL Server)」を参照してください。
Unicode 文字形式のコマンド オプション
bcp、BULK 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;
関連タスク
一括インポートまたは一括エクスポートのデータ形式を使用するには
- 以前のバージョンの SQL Server からネイティブ形式と文字形式のデータをインポートする
- 文字形式を使用したデータのインポートまたはエクスポート (SQL Server)
- ネイティブ形式を使用したデータのインポートまたはエクスポート (SQL Server)
- Unicode ネイティブ形式を使用してデータをインポートまたはエクスポートする (SQL Server)