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

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

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

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

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>

ms189327.note(ja-jp,SQL.90).gifメモ :
<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 照合順序名 (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

Microsoft SQL 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 の値により、要素のインスタンスで必要なオプションの属性 (下記参照) が決まります。

ms189327.note(ja-jp,SQL.90).gifメモ :

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 が指定された (何も値が指定されない) 場合、実行時エラーが発生します。

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

<COLUMN> 要素の xsi:type 値

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

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

データ型 <COLUMN> 要素のデータ型 必要な XML 属性 省略可能な XML 属性

固定

SQLBITSQLTINYINTSQLSMALLINTSQLINTSQLBIGINTSQLFLT4SQLFLT8SQLDATETIMESQLDATETIM4SQLDATETIM8SQLMONEYSQLMONEY4SQLVARIANTSQLUNIQUEID

なし。

NULLABLE

可変数値

SQLDECIMALSQLNUMERIC

なし。

NULLABLE、PRECISION、SCALE

LOB

SQLIMAGECharLOBSQLTEXTSQLUDT

なし。

NULLABLE

CLOB

SQLNTEXT

なし。

NULLABLE

バイナリ文字列

SQLBINARYSQLVARYBIN

なし。

NULLABLE、LENGTH

文字列

SQLCHARSQLVARYCHARSQLNCHARSQLNVARCHAR

なし。

NULLABLE、LENGTH

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

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

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

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

  • bcp コマンド
    データがインポート先のテーブルに読み込まれるとき、bcp コマンドでは <ROW> コンポーネントが無視されます。代わりに、bcp コマンドでは、インポート先テーブルの列の型に基づいてデータが読み込まれます。
  • T-SQL ステートメント (BULK INSERT および OPENROWSET の一括行セット プロバイダ)
    テーブルにデータを一括インポートする際、Transact-SQL ステートメントでは、<ROW> コンポーネントを使用して入力行セットが生成されます。また、Transact-SQL ステートメントでは、<ROW> で指定されている列の型とインポート先のテーブルの対応する列に基づいて適切な型変換が実行されます。フォーマット ファイルで指定されている列の型とインポート先のテーブルの列の型が一致しない場合、追加の型変換が実行されます。この追加の型変換によって、bcp コマンドと比べたときの BULK INSERT または OPENROWSERT の一括行セット プロバイダの動作に矛盾が生じる (精度が低下する) ことがあります。
    <ROW> 要素の情報に基づいて行が構築されるので、追加の情報は必要ありません。このため、SELECT ステートメント (SELECT * FROM OPENROWSET(BULK datafile FORMATFILE=xmlformatfile) を使用して行セットを生成することができます。
    ms189327.note(ja-jp,SQL.90).gifメモ :
    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");
}

参照

概念

XML フォーマット ファイルのサンプル
フォーマット ファイルを使用した作業

その他の技術情報

データ型 (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手