フィールド ターミネータと行ターミネータの指定
文字列データ フィールドでは、省略可能なターミネータ文字を使用して、データ ファイルの各フィールドの末尾 (フィールド ターミネータを使用) と各行の末尾 (行ターミネータを使用) を示すことができます。ターミネータ文字は、フィールドや行の終了位置と次のフィールドや行の開始位置を、データ ファイルを読み取るプログラムに示す方法の 1 つです。
重要 |
---|
ネイティブ形式または Unicode ネイティブ形式を使用するときは、フィールド ターミネータではなくプレフィックス長を使用します。ネイティブ形式のデータ ファイルは Microsoft SQL Server の内部バイナリ データ形式で格納されるので、ネイティブ形式のデータがターミネータと競合することがあります。 |
ターミネータとしてサポートされる文字
bcp コマンド、BULK INSERT ステートメント、および OPENROWSET 一括行セット プロバイダーでは、フィールド ターミネータまたは行ターミネータとしてさまざまな文字がサポートされます。また、常に、各ターミネータの最初のインスタンスが検索されます。ターミネータ用にサポートされる文字を次の表に示します。
ターミネータ文字 |
指定方法 |
---|---|
タブ |
\t 既定のフィールド ターミネータです。 |
改行文字 |
\n 既定の行ターミネータです。 |
キャリッジ リターン/ライン フィード |
\r |
円記号1 |
\\ |
NULL ターミネータ (表示されないターミネータ)2 |
\0 |
任意の印刷可能な文字 (NULL、タブ、改行、およびキャリッジ リターンを除き、制御文字は印刷可能ではありません) |
(*、A、t、l など) |
上に列挙したターミネータ文字の一部または全部を含む 10 文字までの印刷可能な文字列 |
(**\t**、end、!!!!!!!!!!、\t?\n など) |
1 円記号のエスケープ文字と共に制御文字として機能するのは、t、n、r、0 および '\0' だけです。
2 印刷時には NULL 制御文字 (\0) が表示されませんが、データ ファイルでは 1 つの文字です。つまり、フィールド ターミネータまたは行ターミネータとして NULL 制御文字を使用することと、フィールド ターミネータまたは行ターミネータをまったく使用しないことは異なります。
重要 |
---|
データ内にターミネータ文字が出現すると、データではなく、ターミネータとして解釈されます。その文字に続くデータは、次のフィールドまたは次のレコードに属すると解釈されます。したがって、ターミネータがデータに出現することがないように、注意深くターミネータを選択してください。 |
行ターミネータの使用
行ターミネータと最後のフィールドのターミネータを兼用できます。ただし、通常は、行ターミネータを別に指定する方が便利です。たとえば、表形式の出力を生成するには、各行の最後のフィールドを改行文字 (\n) で終了し、他のすべてのフィールドをタブ文字 (\t) で終了します。各データ レコードをデータ ファイル内の独自の行に配置するには、行ターミネータに \r\n の組み合わせを指定します。
注 |
---|
bcp を対話的に使用し、\n (改行) を行ターミネータとして指定すると、bcp によって自動的に \r (キャリッジ リターン) 文字が前に付加され、結果的には行ターミネータが \r\n になります。 |
一括エクスポートのターミネータの指定
char データまたは nchar データを一括エクスポートするときに、既定のターミネータ以外を使用する場合、bcp コマンドに対してターミネータを指定する必要があります。次のいずれかの方法で、ターミネータを指定できます。
フォーマット ファイルで、フィールドごとにターミネータを指定します。
注 フォーマット ファイルの使用方法については、「データのインポートまたはエクスポート用のフォーマット ファイル」を参照してください。
フォーマット ファイルを使用しない場合には、次の方法があります。
-t スイッチを使用して、行内の最後のフィールドを除くすべてのフィールドのフィールド ターミネータを指定します。および、-r スイッチを使用して、行ターミネータを指定します。
-t スイッチを指定しないで、文字形式のスイッチ (-c または -w) を使用すると、フィールド ターミネータがタブ文字 \t に設定されます。-t\t を指定した場合と同じです。
注 -n (ネイティブ データ) スイッチまたは -N (Unicode ネイティブ) スイッチを指定すると、ターミネータは挿入されません。
対話的な bcp コマンドに、in オプションまたは out オプションが含まれていて、フォーマット ファイル スイッチ (-f) またはデータ形式スイッチ (-n、-c、-w、または -N) のいずれも含まれていない場合に、プレフィックス長とフィールド長の指定をしないと、各フィールドのフィールド ターミネータが要求されます。既定ではターミネータは "なし" になっています。
Enter field terminator [none]:
通常は、既定値を選択することをお勧めします。ただし、char データ フィールドまたは nchar データ フィールドについては、次の「ターミネータ使用のガイドライン」を参照してください。コンテキスト内でこのプロンプトが表示される例については、「bcp を使用した互換性のためのデータ形式の指定」を参照してください。
注 bcp コマンドですべてのフィールドを対話形式で指定すると、各フィールドへの応答を XML 形式以外のファイルに保存するように要求するプロンプトが表示されます。XML 以外のフォーマット ファイルの詳細については、「XML 以外のフォーマット ファイルについて」を参照してください。
ターミネータ使用のガイドライン
状況によっては、char データ フィールドまたは nchar データ フィールドには、ターミネータが役に立つ場合があります。次に例を示します
プレフィックス長に関する情報を理解できないプログラムにインポートされるデータ ファイル内のデータ列に NULL 値が含まれる場合。
NULL 値が含まれるデータ列は、すべて可変長であると見なされます。プレフィックス長がないため、ターミネータを使用して NULL フィールドの末尾を示す必要があります。これにより、データが正しく解釈されるようになります。
長い固定長の列に含まれるスペースの一部のみが多数の行によって使用される場合。
このような場合、ターミネータを指定すると、フィールドが可変長フィールドとして扱われるため、格納領域を最小限に抑えることができます。char データの格納におけるプレフィックス長、フィールド長、およびターミネータの相互関係の詳細については、「文字形式のデータの格納」を参照してください。
使用例
この例では、フィールド ターミネータにコンマ、行ターミネータに改行文字 (\n) を使用して、文字形式で AdventureWorksHumanResources.Department テーブルから Department-c-t.txt データ ファイルにデータが一括エクスポートされます。
The bcp コマンドには、次のスイッチがあります。
スイッチ |
説明 |
---|---|
-c |
データ フィールドが文字データとして読み込まれることを指定します。 |
-t, |
コンマ (,) をフィールド ターミネータとして指定します。 |
-r \n |
改行文字を行ターミネータとして指定します。改行文字は既定の行ターミネータなので省略できます。 |
-T |
bcp ユーティリティが統合セキュリティを使用した信頼関係接続を使用して SQL Server に接続することを指定します。-T を指定しない場合、正常にログインするには -U や -P を指定する必要があります。 |
詳細については、「bcp ユーティリティ」を参照してください。
Microsoft Windows コマンド プロンプトで、次のように入力します。
bcp AdventureWorks2008R2.HumanResources.Department out C:\myDepartment-c-t.txt -c -t, -r \n -T
bcp AdventureWorks2008R2.HumanResources.Department out C:\myDepartment-c-t.txt -c -t, -r \n -T
このコマンドにより、それぞれ 4 つのフィールドを持つ 16 個のレコードが含まれる Department-c-t.txt が作成されます。各フィールドはコンマで区切られています。
一括インポートのターミネータの指定
char データまたは nchar データを一括インポートするときに、一括インポート コマンドではデータ ファイルで使用されているターミネータが認識される必要があります。次のように、ターミネータの指定方法は一括インポート コマンドによって異なります。
bcp
インポート操作のターミネータの指定には、エクスポート操作と同じ構文を使用します。詳細については、このトピックの「一括エクスポートのターミネータの指定」を参照してください。
BULK INSERT
次の表に示す修飾子を使用して、フォーマット ファイル内の個別のフィールドまたはデータ ファイル全体にターミネータを指定できます。
修飾子
説明
FIELDTERMINATOR ='field_terminator'
文字データ ファイルや Unicode 文字データ ファイルに使用されるフィールド ターミネータを指定します。
既定値は \t (タブ文字) です。
ROWTERMINATOR ='row_terminator'
文字データ ファイルや Unicode 文字データ ファイルに使用される行ターミネータを指定します。
既定値は \n (改行記号) です。
詳細については、「BULK INSERT (Transact-SQL)」を参照してください。
INSERT ...SELECT * FROM OPENROWSET(BULK...)
OPENROWSET 一括行セット プロバイダーでは、ターミネータを指定できるのはフォーマット ファイルのみです (Large Object データ型を除き、これは必須です)。文字データ ファイルで既定以外のターミネータが使用されている場合、フォーマット ファイルで定義する必要があります。詳細については、「フォーマット ファイルの作成」および「データの一括インポートでのフォーマット ファイルの使用」を参照してください。
OPENROWSET BULK 句の詳細については、「OPENROWSET (Transact-SQL)」を参照してください。
使用例
この例では、前述の例で作成された Department-c-t.txt データ ファイルから、AdventureWorks2008R2 サンプル データベースの myDepartment テーブルに、文字データを一括インポートします。このテーブルを作成しないと、例を実行できません。dbo スキーマでこのテーブルを作成するには、SQL Server Management Studio のクエリ エディターで次のコードを実行します。
USE AdventureWorks2008R2;
GO
DROP TABLE myDepartment;
CREATE TABLE myDepartment
(DepartmentID smallint,
Name nvarchar(50),
GroupName nvarchar(50) NULL,
ModifiedDate datetime not NULL CONSTRAINT DF_AddressType_ModifiedDate DEFAULT (GETDATE())
);
GO
USE AdventureWorks2008R2;
GO
DROP TABLE myDepartment;
CREATE TABLE myDepartment
(DepartmentID smallint,
Name nvarchar(50),
GroupName nvarchar(50) NULL,
ModifiedDate datetime not NULL CONSTRAINT DF_AddressType_ModifiedDate DEFAULT (GETDATE())
);
GO
A. bcp を使用した対話的なターミネータの指定
次の例では、bcp コマンドを使用して、Department-c-t.txt データ ファイルを一括インポートします。このコマンドでは、一括エクスポート コマンドと同じコマンド スイッチを使用します。詳細については、このトピックの「一括エクスポートのターミネータの指定」を参照してください。
Windows コマンド プロンプトで、次のように入力します。
bcp AdventureWorks2008R2..myDepartment in C:\myDepartment-c-t.txt -c -t , -r \n -T
bcp AdventureWorks2008R2..myDepartment in C:\myDepartment-c-t.txt -c -t , -r \n -T
B. BULK INSERT を使用した対話的なターミネータの指定
次の例では、次の表に示す修飾子を指定した BULK INSERT ステートメントを使用して、Department-c-t.txt データ ファイルを一括インポートします。
オプション |
属性 |
---|---|
DATAFILETYPE ='char' |
データ フィールドが文字データとして読み込まれることを指定します。 |
FIELDTERMINATOR =',' |
コンマ (,) をフィールド ターミネータとして指定します。 |
ROWTERMINATOR ='\n' |
改行文字を行ターミネータとして指定します。 |
SQL Server Management Studio のクエリ エディターで、次のコードを実行します。
USE AdventureWorks2008R2;
GO
BULK INSERT myDepartment FROM 'C:\myDepartment-c-t.txt'
WITH (
DATAFILETYPE = 'char',
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
GO
USE AdventureWorks2008R2;
GO
BULK INSERT myDepartment FROM 'C:\myDepartment-c-t.txt'
WITH (
DATAFILETYPE = 'char',
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
GO