次の方法で共有


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

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

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

重要

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

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

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

ターミネータ文字 指定方法 説明
タブ \t 既定のフィールド ターミネータです。
改行文字 \n 既定の行ターミネータです。
キャリッジ リターン/ライン フィード \r
円記号 1 \
Null ターミネータ (非表示ターミネータ) 2 \0
印刷可能な文字 (null、タブ、改行、復帰を除き、制御文字は印刷できません) (*Atlなど)
上に列挙したターミネータ文字の一部または全部を含む 10 文字までの印刷可能な文字列 (**\t**end!!!!!!!!!!\t-\nなど)

1tnr0、および \0 文字のみが円記号エスケープ文字で動作し、制御文字を生成します。

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

重要

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

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

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

bcp を対話形式で使用し、行ターミネータとして \n (改行) を指定すると、bcp によって自動的に\r (復帰) 文字がプレフィックス付けされ、結果として行ターミネータが\r\nされます。

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

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

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

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

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

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

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

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

    • 対話型 bcp コマンドに、フォーマット ファイル スイッチ (-f) またはデータ形式スイッチ (-n-c-w、または-N) を指定せずにinまたはoutオプションが含まれている場合、プレフィックスの長さとフィールドの長さを指定しないことを選択すると、各フィールドのフィールド ターミネータのコマンド プロンプトが表示され、既定値は none になります。

      Enter field terminator [none]:

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

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

ターミネータを使用するためのガイドライン

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

  • プレフィックスの長さの情報を理解していないプログラムにインポートされるデータ ファイル内の null 値を含むデータ列の場合。

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

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

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

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

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

bcp -r '0x0A'

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

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

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

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

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

bcp AdventureWorks2022.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」を参照してください。

  • INSERT ... SELECT * FROM OPENROWSET(BULK...)

    OPENROWSET一括行セット プロバイダーの場合、ターミネータはフォーマット ファイル内でのみ指定できます (ラージ オブジェクト データ型を除く必要があります)。 文字データ ファイルで既定以外のターミネータが使用されている場合、フォーマット ファイルで定義する必要があります。 詳細については、「フォーマット ファイルの作成 (SQL Server)」と「データの一括インポートでのフォーマット ファイルの使用 (SQL Server)」を参照してください。

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

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

一括インポートの行ターミネータとして \n を指定するか、既定の行ターミネータを暗黙的に使用する場合、 bcpBULK INSERT ステートメントでは、行ターミネータとして復帰改行の組み合わせ (CRLF) が想定されます。 Unix および Linux コンピューターで生成されるファイルの一般的なように、ソース ファイルで行ターミネータとして改行文字 (LF) のみを使用する場合は、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 CONSTRAINT
        DF_AddressType_ModifiedDate DEFAULT (GETDATE()) NOT NULL
);
GO

A。 bcp を使用して対話的なターミネータを指定する

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

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

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

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

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

オプション 特性
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