フィールド ターミネータと行ターミネータの指定 (SQL Server)

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

文字列データ フィールドでは、省略可能なターミネータ文字を使用して、データ ファイルの各フィールドの末尾 ( フィールド ターミネータ を使用) と各行の末尾 ( 行ターミネータを使用) を示すことができます。 ターミネータ文字は、フィールドや行の終了位置と次のフィールドや行の開始位置を、データ ファイルを読み取るプログラムに示す方法の 1 つです。

重要

ネイティブ形式または Unicode ネイティブ形式を使用するときは、フィールド ターミネータではなくプレフィックス長を使用します。 ネイティブ形式のデータ ファイルは Microsoft SQL Server の内部バイナリ データ形式で格納されるので、ネイティブ形式のデータがターミネータと競合することがあります。

ターミネータとしてサポートされる文字

bcp コマンド、BULK INSERT ステートメント、および OPENROWSET 一括行セット プロバイダーでは、フィールド ターミネータまたは行ターミネータとしてさまざまな文字がサポートされます。また、常に、各ターミネータの最初のインスタンスが検索されます。 ターミネータ用にサポートされる文字を次の表に示します。

ターミネータ文字 指定方法
Tab \t

既定のフィールド ターミネータです。
改行文字 \n

既定の行ターミネータです。
キャリッジ リターン/ライン フィード \r
円記号* \|
NULL ターミネータ (表示されないターミネータ)** \0
任意の印刷可能な文字 (NULL、タブ、改行、およびキャリッジ リターンを除き、制御文字は印刷可能ではありません) (*、A、t、l など)
上に列挙したターミネータ文字の一部または全部を含む 10 文字までの印刷可能な文字列 (**\t**、end、!!!!!!!!!!、\t-\n など)

*円記号のエスケープ文字と共に制御文字として機能するのは、t、n、r、0 および '\0' だけです。

**印刷時には NULL 制御文字 (\0) が表示されませんが、データ ファイルでは 1 つの文字です。 つまり、フィールド ターミネータまたは行ターミネータとして NULL 制御文字を使用することと、フィールド ターミネータまたは行ターミネータをまったく使用しないことは異なります。

重要

データ内にターミネータ文字が出現すると、データではなく、ターミネータとして解釈されます。その文字に続くデータは、次のフィールドまたは次のレコードに属すると解釈されます。 したがって、ターミネータがデータに出現することがないように、注意深くターミネータを選択してください。 たとえば、データに下位サロゲートが含まれている場合、フィールド ターミネータには下位サロゲート フィールド ターミネータは適していません。

行ターミネータを使用する

行ターミネータと最後のフィールドのターミネータを兼用できます。 ただし、通常は、行ターミネータを別に指定する方が便利です。 たとえば、表形式の出力を生成するには、各行の最後のフィールドを改行文字 (\n) で終了し、他のすべてのフィールドをタブ文字 (\t) で終了します。 各データ レコードをデータ ファイル内の独自の行に配置するには、行ターミネータに \r\n の組み合わせを指定します。

Note

bcp を対話的に使用し、\n (改行) を行ターミネータとして指定すると、 bcp によって自動的に \r (キャリッジ リターン) 文字が前に付加され、結果的には行ターミネータが \r\n になります。

一括エクスポートのターミネータを指定する

char データまたは nchar データを一括エクスポートするときに、既定のターミネータ以外を使用する場合、 bcp コマンドに対してターミネータを指定する必要があります。 次のいずれかの方法で、ターミネータを指定できます。

  • フォーマット ファイルで、フィールドごとにターミネータを指定します。

    Note

    フォーマット ファイルの使用方法の詳細については、「データのインポートまたはエクスポート用のフォーマット ファイル (SQL Server)」を参照してください。

  • フォーマット ファイルを使用しない場合には、次の方法があります。

    • -t スイッチを使用して、行内の最後のフィールドを除くすべてのフィールドのフィールド ターミネータを指定します。さらに、 -r スイッチを使用して、行ターミネータを指定します。

    • -t スイッチを指定しないで、文字形式のスイッチ ( -cまたは -w ) を使用すると、フィールド ターミネータがタブ文字 \t に設定されます。 これは、 -t\t を指定することと同じです。

      Note

      -n (ネイティブ データ) スイッチまたは -N (Unicode ネイティブ) スイッチを指定すると、ターミネータは挿入されません。

    • 対話的な bcp コマンドに、 in オプションまたは out オプションが含まれていて、フォーマット ファイル スイッチ (-f) またはデータ形式スイッチ (-n-c-w、または -N) のいずれも含まれていない場合に、プレフィックス長とフィールド長の指定をしないと、各フィールドのフィールド ターミネータが要求されます。既定ではターミネータは "なし" になっています。

      Enter field terminator [none]:

      通常は、既定値を選択することをお勧めします。 ただし、char または nchar データ フィールドについては、次のサブセクション「ターミネータ使用のガイドライン」を参照してください。コンテキストでこのプロンプトを表示する例については、「bcp を使用した互換性のためのデータ形式の指定 (SQL Server)」を参照してください。

      Note

      bcp コマンドですべてのフィールドを対話形式で指定すると、各フィールドへの応答を XML 形式以外のファイルに保存するように要求するプロンプトが表示されます。 XML 以外のフォーマット ファイルに関する詳細については、「XML 以外のフォーマット ファイル (SQL Server)」を参照してください。

ターミネータ使用のガイドライン

状況によっては、 char データ フィールドまたは nchar データ フィールドには、ターミネータが役に立つ場合があります。 次に例を示します。

  • プレフィックス長がわからないプログラムにインポートされるデータ ファイル内で NULL 値が含まれるデータ列。

    NULL 値が含まれているすべてのデータ列は、可変長と見なされます。 プレフィックス長がない場合、ターミネータは、データが正しく解釈されるように NULL 値の末尾を識別する必要があります。

  • 多くの列によって領域が部分的にのみ使用されている、長い固定長の列。

    この状況では、ターミネータを指定することで記憶領域が最小限になり、フィールドが可変長として処理されます。

\n を一括エクスポートの行ターミネータとして指定する

\n を一括エクスポートの行ターミネータとして指定するか、既定の行ターミネータを暗黙的に使用する場合、bcp では復帰と改行の組み合わせ (CRLF) が行ターミネータとして出力されます。 行ターミネータとして改行文字のみ (LF) を出力する場合 (Unix および Linux コンピュータの標準)、16 進数表記を使用して LF 行ターミネータを指定します。 次に例を示します。

bcp -r '0x0A'

この例では、フィールド ターミネータにコンマ、行ターミネータに改行文字 (\n) を使用して、文字形式で AdventureWorks.HumanResources.Department テーブルから Department-c-t.txt データ ファイルにデータが一括エクスポートされます。

bcp コマンドには、次のスイッチがあります。

Switch 説明
-c データ フィールドが文字データとして読み込まれることを指定します。
-t , コンマ (,) をフィールド ターミネータとして指定します。
-r \n 改行文字を行ターミネータとして指定します。 改行文字は既定の行ターミネータなので省略できます。
-T bcp ユーティリティが統合セキュリティを使用した信頼関係接続を使用して SQL Server に接続することを指定します。 -T を指定しない場合、正常にログインするには -U-P を指定する必要があります。

詳細については、「 bcp Utility」を参照してください。

Microsoft Windows コマンド プロンプトで、次のように入力します。

bcp AdventureWorks.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 データ型を除き、これは必須です)。 文字データ ファイルで既定以外のターミネータが使用されている場合、フォーマット ファイルで定義する必要があります。 詳細については、「フォーマット ファイルの作成 (SQL Server)」と「データの一括インポートでのフォーマット ファイルの使用 (SQL Server)」を参照してください。

    OPENROWSET BULK 句の詳細については、「OPENROWSET (Transact-SQL)」を参照してください。

\n を一括インポートの行ターミネータとして指定する

\n を一括インポートの行ターミネータとして指定するか、既定の行ターミネータを暗黙的に使用する場合、bcp および BULK INSERT ステートメントでは、復帰と改行の組み合わせ (CRLF) が行ターミネータとして想定されます。 ソース ファイルで改行文字のみ (LF) が行ターミネータとして使用されている場合 (Unix および Linux コンピュータで生成されたファイルの標準)、16 進数表記を使用して LF 行ターミネータを指定します。 BULK INSERT ステートメントの例を次に示します。

 ROWTERMINATOR = '0x0A'

この例では、前述の例で作成された Department-c-t.txt データ ファイルから、 myDepartment サンプル データベースの AdventureWorks2022 テーブルに、文字データを一括インポートします。 このテーブルを作成しないと、例を実行できません。 dbo スキーマでこのテーブルを作成するには、SQL Server Management Studio のクエリ エディターで次のコードを実行します。

USE AdventureWorks2022;
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 を使用して対話的なターミネータを指定する

次の例では、 Department-c-t.txt コマンドを使用して、 bcp データ ファイルを一括インポートします。 このコマンドでは、一括エクスポート コマンドと同じコマンド スイッチを使用します。 詳細については、このトピックの「一括エクスポートのターミネータの指定」を参照してください。

Windows コマンド プロンプトで、次のように入力します。

bcp AdventureWorks2022..myDepartment in C:\myDepartment-c-t.txt -c -t , -r \n -T

B. BULK INSERT を使用して対話的なターミネータを指定する

次の例では、次の表に示す修飾子を指定した Department-c-t.txt ステートメントを使用して、 BULK INSERT データ ファイルを一括インポートします。

オプション Attribute
DATAFILETYPE ='char' データ フィールドが文字データとして読み込まれることを指定します。
FIELDTERMINATOR =',' コンマ (,) をフィールド ターミネータとして指定します。
ROWTERMINATOR ='\n' 改行文字を行ターミネータとして指定します。

SQL Server Management Studio のクエリ エディターで、次のコードを実行します。

USE AdventureWorks2022;
GO
BULK INSERT myDepartment FROM 'C:\myDepartment-c-t.txt'
     WITH (
     DATAFILETYPE = 'char',
     FIELDTERMINATOR = ',',
     ROWTERMINATOR = '\n'
);
GO

次のステップ