XML フォーマット ファイルのスキーマ構文

ここでは、XML フォーマット ファイルの構文について説明します。構文が実際の XML フォーマット ファイルとどのように対応しているかについては、「XML フォーマット ファイルのサンプル」を参照してください。また、一括インポートで <ROW> 要素と <COLUMN> 要素がどのように使用されるのか、および要素の xsi:type 値をデータセットに格納する方法についても説明します。

XML フォーマット ファイルは、bcp コマンド、BULK INSERT ステートメント、または INSERT ... SELECT * FROM OPENROWSET(BULK...) ステートメントで使用できます。

注意注意

   フォーマット ファイルを変更して、フィールドの数や順序がテーブル列とは異なるデータ ファイルから一括インポートできます。詳細については、「一括インポート時にフォーマット ファイルを使用したフィールドから列へのマッピング」を参照してください。

XML スキーマの基本構文

この基本構文のステートメントでは、要素 (<BCPFORMAT>、<RECORD>、<FIELD>、<ROW>、および <COLUMN>) とその基本属性のみを示します。

<BCPFORMAT ...>

   <RECORD>

      <FIELD ID = "fieldID" xsi:type = "fieldType" [...]

      />

   </RECORD>

   <ROW>

      <COLUMN SOURCE = "fieldID" NAME = "columnName" xsi:type = "columnType" [...]

      />

   </ROW>

</BCPFORMAT>

注意注意

<FIELD> 要素または <COLUMN> 要素の xsi:type の値と関連付けられている他の属性については、このトピックの後半で説明します。

スキーマ要素について

ここでは、XML スキーマで XML フォーマット ファイル用に定義している各要素の目的を説明します。各要素の属性については、このトピックの後半で説明します。

  • <BCPFORMAT>
    特定のデータ ファイルのレコード構造とテーブル内の対応するテーブル行の列を定義するフォーマット ファイル要素です。

  • <RECORD .../>
    1 つ以上の <FIELD> 要素を含む複合要素を定義します。フォーマット ファイルでフィールドが宣言される順序は、データ ファイルでフィールドが表示される順序と同じです。

  • <FIELD .../>
    データを含むデータ ファイル内のフィールドを定義します。

    この要素の属性については、このトピックの「<FIELD> 要素の属性」で説明します。

  • <ROW .../>
    1 つ以上の <COLUMN> 要素を含む複合要素を定義します。<COLUMN> 要素の順序は、RECORD 定義の <FIELD> 要素の順序とは関係ありません。結果行セットの列の順序は、フォーマット ファイルの <COLUMN> 要素の順序で決まります。データ フィールドは、対応する <COLUMN> 要素が <COLUMN> 要素内で宣言されている順序で読み込まれます。

    詳細については、このトピックの「一括インポートで <ROW> 要素を使用する方法」を参照してください。

  • <COLUMN>
    列を要素 (<COLUMN>) として定義します。各 <COLUMN> 要素は、<FIELD> 要素に対応しています (FIELD 要素の ID は、<COLUMN> 要素の SOURCE 属性で指定されます)。

    この要素の属性については、このトピックの「<COLUMN> 要素の属性」で説明します。詳細については、このトピックの「一括インポートで <COLUMN> 要素を使用する方法」を参照してください。

  • </BCPFORMAT>
    フォーマット ファイルを終了するために必要なフォーマット ファイル要素です。

<FIELD> 要素の属性

ここでは、次のスキーマ構文に示す <FIELD> 要素の属性について説明します。

<FIELD

   ID ="fieldID"

   xsi**:**type ="fieldType"

   [ LENGTH ="n" ]

   [ PREFIX_LENGTH ="p" ]

   [ MAX_LENGTH ="m" ]

   [ COLLATION ="collationName" ]

   [ TERMINATOR ="terminator" ]

/>

各 <FIELD> 要素は、互いに独立しています。フィールドは、次の属性を使用して表現されます。

FIELD 要素の属性

説明

省略可能 /

必須

ID ="fieldID"

データ ファイル内のフィールドの論理名を指定します。フィールドの ID は、フィールドを参照する際に使用するキーになります。

<FIELD ID="fieldID"/> maps to <COLUMN SOURCE="fieldID"/>

必須

xsi:type ="fieldType"

要素のインスタンスの種類を特定する XML コンストラクトです (これは属性のように使用します)。fieldType の値により、要素のインスタンスで必要なオプションの属性 (下記参照) が決まります。

必須 (データ型により異なる)

LENGTH ="n"

固定長データ型のインスタンスの長さを定義します。

n の値は、正の整数にする必要があります。

省略可能 (xsi:type 値で必要な場合は必須)。

PREFIX_LENGTH ="p"

バイナリ データ表現のプレフィックス長を定義します。PREFIX_LENGTH 値の p は、1、2、4、または 8 のいずれかにする必要があります。

省略可能 (xsi:type 値で必要な場合は必須)。

MAX_LENGTH ="m"

指定したフィールドに格納できる最大バイト数を定義します。対象のテーブルがない場合、列の最大長を決めることはできません。MAX_LENGTH 属性では、出力先の文字列型の列の最大長を制限し、列の値に割り当てる領域を制限しています。この属性は、SELECT FROM 句で OPENROWSET 関数の BULK オプションを使用している場合に特に有益です。

m の値は、正の整数にする必要があります。既定では、char 列の最大長は 8,000 文字で、nchar 列の最大長は 4,000 文字です。

省略可能

COLLATION ="collationName"

COLLATION は、文字列型のフィールドでのみ使用できる属性です。SQL 照合順序名の一覧については、「SQL Server 照合順序名 (Transact-SQL)」を参照してください。

省略可能

TERMINATOR = "terminator"

データ フィールドのターミネータを指定します。ターミネータには、任意の文字を使用できます。ただし、ターミネータには、データに含まれていない一意な文字を使用する必要があります。

既定では、フィールド ターミネータはタブ文字 (\t) です。段落記号を表すには、\r\n を使用します。

この属性が必要な文字型データの xsi:type でのみ使用されます。

<FIELD> 要素の xsi:type 値

xsi:type 値は、要素のインスタンスのデータ型を特定する XML コンストラクトです (これは属性のように使用します)。詳細については、このトピックの「xsi:type 値のデータセットへの格納」を参照してください。

<FIELD> 要素の xsi:type 値では、次のデータ型がサポートされています。

<FIELD> 要素の xsi:type の値

必要な XML

属性

省略可能な XML

属性

NativeFixed

LENGTH

なし。

NativePrefix

PREFIX_LENGTH

MAX_LENGTH

CharFixed

LENGTH

COLLATION

NCharFixed

LENGTH

COLLATION

CharPrefix

PREFIX_LENGTH

MAX_LENGTH、COLLATION

NCharPrefix

PREFIX_LENGTH

MAX_LENGTH、COLLATION

CharTerm

TERMINATOR

MAX_LENGTH、COLLATION

NCharTerm

TERMINATOR

MAX_LENGTH, COLLATION

MicrosoftSQL Server のデータ型の詳細については、「データ型 (Transact-SQL)」を参照してください。

<COLUMN> 要素の属性

ここでは、次のスキーマ構文に示す <COLUMN> 要素の属性について説明します。

<COLUMN

   SOURCE = "fieldID"

   NAME = "columnName"

   xsi:type = "columnType"

   [ LENGTH = "n" ]

   [ PRECISION = "n" ]

   [ SCALE = "value" ]

   [ NULLABLE = { "YES"

"NO" } ]

/>

フィールドは、次の属性を使用して、対象となるテーブルにマップされます。

COLUMN 要素の属性

説明

省略可能 /

必須

SOURCE ="fieldID"

列にマップされているフィールドの ID を指定します。

<COLUMN SOURCE="fieldID"/> maps to <FIELD ID="fieldID"/>

必須

NAME = "columnName"

フォーマット ファイルで表している行セットの列の名前を指定します。この列名は、結果セット内で列名を特定する際に使用されるので、対象のテーブルで使用されている列名に対応する必要はありません。

必須

xsi:type ="ColumnType"

要素のインスタンスのデータ型を特定する XML コンストラクトです (これは属性のように使用します)。ColumnType の値により、要素のインスタンスで必要なオプションの属性 (下記参照) が決まります。

注意注意
ColumnType に設定できる値と関連のある属性値は、次の表に示します。

省略可能

LENGTH ="n"

固定長データ型のインスタンスの長さを定義します。LENGTH 属性は、xsi:type が文字列データ型の場合にのみ使用します。

n の値は、正の整数にする必要があります。

省略可能 (xsi:type が文字列データ型の場合にのみ使用可能)

PRECISION ="n"

数値全体の桁数を示します。たとえば、数字 123.45 の有効桁数は 5 桁です。

この値は、正の整数にする必要があります。

省略可能 (xsi:type が可変数値のデータ型の場合にのみ使用可能)

SCALE ="int"

数値の中で小数点より右側の桁数を示します。たとえば、数字 123.45 の小数点以下桁数は 2 桁です。

この値は、整数にする必要があります。

省略可能 (xsi:type が可変数値のデータ型の場合にのみ使用可能)

NULLABLE = { "YES"

"NO" }

列で NULL 値を使用できるかどうかを示します。この属性は、FIELDS 要素から完全に独立しています。ただし、列が NULLABLE ではない場合に、フィールドで NULL が指定された (何も値が指定されない) 場合、実行時エラーが発生します。

NULLABLE 属性は、プレーンな SELECT FROM OPENROWSET(BULK...) ステートメントを実行する場合にのみ使用します。

省略可能 (任意のデータ型で使用可能)

<COLUMN> 要素の xsi:type 値

xsi:type 値は、要素のインスタンスのデータ型を特定する XML コンストラクトです (これは属性のように使用します)。詳細については、このトピックの「xsi:type 値のデータセットへの格納」を参照してください。

次の表に示すように、<COLUMN> 要素ではネイティブな SQL データ型がサポートされています。

データ型

<COLUMN> 要素のデータ型

必要な XML

属性

省略可能な XML

属性

固定

SQLBIT、SQLTINYINT、SQLSMALLINT、SQLINT、SQLBIGINT、SQLFLT4、SQLFLT8、SQLDATETIME、SQLDATETIM4、SQLDATETIM8、SQLMONEY、SQLMONEY4、SQLVARIANT、SQLUNIQUEID

なし。

NULLABLE

可変数値

SQLDECIMAL 、SQLNUMERIC

なし。

NULLABLE、PRECISION、SCALE

LOB

SQLIMAGE、CharLOB、SQLTEXT、SQLUDT

なし。

NULLABLE

CLOB

SQLNTEXT

なし。

NULLABLE

バイナリ文字列

SQLBINARY 、SQLVARYBIN

なし。

NULLABLE、LENGTH

文字列

SQLCHAR、SQLVARYCHAR、SQLNCHAR、SQLNVARCHAR

なし。

NULLABLE、LENGTH

重要な注意事項重要

SQLXML データを一括エクスポートまたは一括インポートする場合、フォーマット ファイルのデータ型には、SQLCHAR または SQLVARYCHAR (データはクライアント コード ページまたは照合順序で暗黙的に指定されるコード ページで送られます)、SQLNCHAR または SQLNVARCHAR (データは Unicode として送られます)、SQLBINARY または SQLVARYBIN (データは変換なしで送られます) のいずれかを使用します。

SQL Server のデータ型の詳細については、「データ型 (Transact-SQL)」を参照してください。

一括インポートで &lt;ROW&gt; 要素を使用する方法

一部のコンテキストでは、<ROW> 要素は無視されます。<ROW> 要素が一括インポート操作に影響を与えるかどうかは、一括インポート操作がどのように実行されるかによって異なります。

  • bcp コマンド

    データがインポート先のテーブルに読み込まれるとき、bcp コマンドでは <ROW> コンポーネントが無視されます。代わりに、bcp コマンドでは、インポート先テーブルの列の型に基づいてデータが読み込まれます。

  • Transact-SQL ステートメント (BULK INSERT および OPENROWSET の一括行セット プロバイダー)

    テーブルにデータを一括インポートする際、Transact-SQL ステートメントでは、<ROW> コンポーネントを使用して入力行セットが生成されます。また、Transact-SQL ステートメントでは、<ROW> で指定されている列の型とインポート先のテーブルの対応する列に基づいて適切な型変換が実行されます。フォーマット ファイルで指定されている列の型とインポート先のテーブルの列の型が一致しない場合、追加の型変換が実行されます。この追加の型変換によって、bcp コマンドと比べたときの BULK INSERT または OPENROWSET の一括行セット プロバイダーの動作に矛盾が生じる (精度が低下する) ことがあります。

    <ROW> 要素の情報に基づいて行が構築されるので、追加の情報は必要ありません。このため、SELECT ステートメント (SELECT * FROM OPENROWSET(BULK datafile FORMATFILE=xmlformatfile) を使用して行セットを生成することができます。

    注意注意

    OPENROWSET BULK 句では、フォーマット ファイルが必要です (フィールドのデータ型から列のデータ型に変換する処理には、XML フォーマット ファイルが必要であることに注意してください)。

一括インポートで &lt;COLUMN&gt; 要素を使用する方法

データをテーブルに一括インポートする際、フォーマット ファイル内の <COLUMN> 要素により、次のことが指定され、データ ファイルのフィールドがテーブルの列にマップされます。

  • データ ファイルの行内における各フィールドの位置。

  • 列の型 (この型はフィールドのデータ型を適切な列のデータ型に変換する際に使用します)。

フィールドに列がマップされていない場合、フィールドは生成された行にコピーされません。この動作により、データ ファイルでは、(異なるテーブルの) 異なる列を持つ行を生成することができます。

同様に、データをテーブルから一括エクスポートする際、フォーマット ファイルの各 <COLUMN> 要素により、エクスポート元のテーブル行の列が出力先データ ファイルの対応するフィールドにマップされます。

xsi:type 値のデータセットへの格納

XML ドキュメントが XML Schema Definition (XSD) 言語で検証されると、xsi:type 値はデータセットに格納されません。ただし、次のコードに示すように、XML フォーマット ファイルを XML ドキュメント (たとえば、myDoc) に読み込んで、xsi:type の情報をデータセットに格納することができます。

...;
myDoc.LoadXml(xmlFormat);
XmlNodeList ColumnList = myDoc.GetElementsByTagName("COLUMN");
for(int i=0;i<ColumnList.Count;i++)
{
   Console.Write("COLUMN: xsi:type=" +ColumnList[i].Attributes["type",
      "http://www.w3.org/2001/XMLSchema-instance"].Value+"\n");
}