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 照合順序名 (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 の値により、要素のインスタンスで必要なオプションの属性 (下記参照) が決まります。
メモ :
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 属性 |
---|---|---|---|
固定 |
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)」を参照してください。
一括インポートで <ROW> 要素を使用する方法
<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) を使用して行セットを生成することができます。メモ : OPENROWSET BULK 句では、フォーマット ファイルが必要です (フィールドのデータ型から列のデータ型に変換する処理には、XML フォーマット ファイルが必要であることに注意してください)。
一括インポートで <COLUMN> 要素を使用する方法
データをテーブルに一括インポートする際、フォーマット ファイル内の <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 フォーマット ファイルのサンプル
フォーマット ファイルを使用した作業