XML 一括読み込みのガイドラインと制限 (SQLXML 4.0)
適用対象: SQL Server Azure SQL Database
XML 一括読み込みを使用する場合は、次のガイドラインと制限に留意してください。
インライン スキーマはサポートされません。
インライン スキーマがソース XML ドキュメントにある場合、XML 一括読み込みでそのスキーマは無視されます。 XML 一括読み込みには、XML データの外部にあるマッピング スキーマを指定してください。 xmlns="x:schema" 属性を使用して、ノードでマッピング スキーマを指定することはできません。
XML ドキュメントが適切な形式であるかどうかはチェックされますが、検証は行われません。
XML 一括読み込みでは、XML ドキュメントが整形式であるかどうかを確認し、XML が World Wide Web Consortium の XML 1.0 の推奨事項の構文要件に準拠していることを確認します。 ドキュメントが適切な形式でない場合、XML 一括読み込みの処理は取り消され、エラーが返されます。 ただし、ドキュメントがフラグメントの場合 (ドキュメントに単一のルート要素がない場合) だけは、XML 一括読み込みでドキュメントが読み込まれます。
XML 一括読み込みでは、XML データ ファイル内で定義または参照されている XML-Data または DTD スキーマに関して、ドキュメントの検証は行われません。 さらに、XML 一括読み込みでは、指定されるマッピング スキーマに対して XML データ ファイルは検証されません。
XML prolog 情報は無視されます。
XML 一括読み込みでは、XML ドキュメント内の <root> 要素の前後のすべての情報が無視されます。 たとえば、XML 宣言、内部 DTD 定義、外部 DTD 参照、コメントなどは無視されます。
マッピング スキーマで、2 つのテーブル (たとえば Customer と CustOrder) 間の主キー/外部キーのリレーションシップを定義する場合は、主キーがあるテーブルを先に記述する必要があります。 外部キー列があるテーブルは、後に記述します。 その理由は、テーブルがスキーマで識別される順序が、データベースへの読み込みに使用される順序であるためです。たとえば、次の XDR スキーマでは、 <Order> 要素が <Customer> 要素の前に記述されているため、XML 一括読み込みで使用するとエラーが発生します。 CustOrder の CustomerID 列は、Cust テーブル内の CustomerID 主キー列を参照する外部キー列です。
<?xml version="1.0" ?> <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:xml:datatypes" xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <ElementType name="Order" sql:relation="CustOrder" > <AttributeType name="OrderID" /> <AttributeType name="CustomerID" /> <attribute type="OrderID" /> <attribute type="CustomerID" /> </ElementType> <ElementType name="CustomerID" dt:type="int" /> <ElementType name="CompanyName" dt:type="string" /> <ElementType name="City" dt:type="string" /> <ElementType name="root" sql:is-constant="1"> <element type="Customers" /> </ElementType> <ElementType name="Customers" sql:relation="Cust" sql:overflow-field="OverflowColumn" > <element type="CustomerID" sql:field="CustomerID" /> <element type="CompanyName" sql:field="CompanyName" /> <element type="City" sql:field="City" /> <element type="Order" > <sql:relationship key-relation="Cust" key="CustomerID" foreign-key="CustomerID" foreign-relation="CustOrder" /> </element> </ElementType> </Schema>
スキーマで sql:overflow-field 注釈を使用してオーバーフロー列を指定しない場合、XML 一括読み込みでは、XML ドキュメントに存在するがマッピング スキーマには記述されていないデータは無視されます。
XML 一括読み込みでは、XML データ ストリーム内に既知のタグが検出されると常に、指定のマッピング スキーマが適用されます。 XML ドキュメントに存在していてもスキーマに記述されていないデータは無視されます。 たとえば、 <Customer> 要素を記述するマッピング スキーマがあるとします。 XML データ ファイルには、すべての <Customer> 要素を囲む <AllCustomers> ルート タグ (スキーマでは説明されていません) があります。
<AllCustomers> <Customer>...</Customer> <Customer>...</Customer> ... </AllCustomers>
この場合、XML 一括読み込みでは、 <AllCustomers> 要素が無視され、 <Customer> 要素でマッピングが開始されます。 XML ドキュメントに存在していてもスキーマに記述されていない要素は無視されます。
<Order> 要素を含む別の XML ソース データ ファイルについて考えてみましょう。 この要素はマッピング スキーマには記述されていません。
<AllCustomers> <Customer>...</Customer> <Order> ... </Order> <Order> ... </Order> ... <Customer>...</Customer> <Order> ... </Order> <Order> ... </Order> ... ... </AllCustomers>
XML 一括読み込みでは、これらの <Order> 要素は無視されます。 ただし、スキーマで sql:overflow-fieldannotation を使用して列をオーバーフロー列として識別する場合、XML 一括読み込みでは、この列にすべての未使用のデータが格納されます。
CDATA セクションとエンティティ参照は、データベースに保存される前に、同等の文字列に変換されます。
この例では、CDATA セクションは、 <City> 要素の値をラップします。 XML 一括読み込みでは、 <City> 要素をデータベースに挿入する前に、文字列値 ("NY") が抽出されます。
<City><![CDATA[NY]]> </City>
XML 一括読み込みでは、エンティティ参照は保持されません。
マッピング スキーマで属性に既定値が指定されており、その属性が XML ソース データに含まれていない場合、XML 一括読み込みでは既定値が使用されます。
次のサンプル XDR スキーマでは、 HireDate 属性に既定値が割り当てられます。
<?xml version="1.0" ?> <Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:xml:datatypes" xmlns:sql="urn:schemas-microsoft-com:xml-sql" > <ElementType name="root" sql:is-constant="1"> <element type="Customers" /> </ElementType> <ElementType name="Customers" sql:relation="Cust3" > <AttributeType name="CustomerID" dt:type="int" /> <AttributeType name="HireDate" default="2000-01-01" /> <AttributeType name="Salary" /> <attribute type="CustomerID" sql:field="CustomerID" /> <attribute type="HireDate" sql:field="HireDate" /> <attribute type="Salary" sql:field="Salary" /> </ElementType> </Schema>
この XML データでは、2 番目の <Customers> 要素に HireDate 属性がありません。 XML 一括読み込みでは、2 番目の <Customers> 要素をデータベースに挿入すると、スキーマで指定されている既定値が使用されます。
<ROOT> <Customers CustomerID="1" HireDate="1999-01-01" Salary="10000" /> <Customers CustomerID="2" Salary="10000" /> </ROOT>
sql:url-encode 注釈はサポートされていません。
XML データ入力に URL を指定して、その場所からデータの一括読み込みを行うことはできません。
マッピング スキーマで指定されているテーブルは、新しく作成されます (データベースは存在する必要があります)。 1 つ以上のテーブルがデータベースに既に存在する場合、SGDropTables プロパティは、これらの既存のテーブルを削除して再作成するかどうかを決定します。
SchemaGen プロパティ (SchemaGen = true など) を指定すると、マッピング スキーマで識別されるテーブルが作成されます。 ただし、SchemaGen では、これらのテーブルに制約 (PRIMARY KEY/FOREIGN KEY 制約など) は作成されませんが、1 つの例外があります。リレーションシップの主キーを構成する XML ノードが XML 型の ID (つまり、XSD の場合は type="xsd:ID" ) を持つと定義され、SchemaGen の SGUseID プロパティが True に設定されている場合、 では、ID 型指定されたノードから主キーが作成されるだけでなく、主キーと外部キーのリレーションシップはマッピング スキーマリレーションシップから作成されます。
SchemaGen は、リレーショナル SQL Server スキーマを生成するために XSD スキーマファセットと拡張機能を使用しません。
一括読み込み時に SchemaGen プロパティ (SchemaGen = true など) を指定すると、指定されたテーブル (共有名のビューではなく) のみが更新されます。
SchemaGen には、注釈付き XSD からリレーショナル スキーマを生成するための基本的な機能のみが用意されています。 ユーザーは必要に応じて、生成されたテーブルを手動で変更する必要があります。
テーブル間に複数のリレーションシップが存在する場合、SchemaGen は、2 つのテーブル間に関係するすべてのキーを含む 1 つのリレーションシップを作成しようとします。 この制限は、Transact-SQL エラーの原因である可能性があります。
データベースに XML データの一括読み込みを行う場合は、マッピング スキーマ内に、データベース列にマップされる属性または子要素が 1 つ以上存在している必要があります。
XML 一括読み込みを使用して日付値を挿入する場合、値は (-)CCYY-MM-DD((+-)TZ) の形式で指定する必要があります。 これは日付の標準の XSD 形式です。
一部のプロパティ フラグは、他のプロパティ フラグと互換性がありません。 たとえば、一括読み込みでは、 Ignoreduplicatekeys=true と共に Keepidentity=false はサポートされません。 Keepidentity=false の場合、一括読み込みでは、サーバーがキー値を生成することが想定されます。 テーブルには、キーに対する IDENTITY 制約が必要です。 サーバーは重複するキーを生成しません。つまり、 Ignoreduplicatekeys を true に設定する必要はありません。 Ignoreduplicatekeys を true に設定する必要があります 行を含むテーブルに受信データから主キー値をアップロードする場合にのみ、主キー値の競合が発生する可能性があります。