XML 一括読み込みのガイドラインと制限 (SQLXML 4.0)
XML 一括読み込みを使用するにあたっては、次のガイドラインと制限に留意してください。
インライン スキーマはサポートされません。
インライン スキーマがソース XML ドキュメントにある場合、XML 一括読み込みでそのスキーマは無視されます。XML 一括読み込みには、XML データの外部にあるマッピング スキーマを指定してください。ノードで xmlns="x:schema" 属性を使用してマッピング スキーマを指定することはできません。
XML ドキュメントが適切な形式であるかどうかはチェックされますが、検証は行われません。
XML 一括読み込みでは、XML ドキュメントが適切な形式であるかどうか、つまり W3C (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 ドキュメントに存在していてもスキーマに記述されていない要素は無視されます。
また、別の XML ソース データ ファイルに、<Order> 要素が含まれているとします。この要素はマッピング スキーマには記述されていません。
<AllCustomers> <Customer>...</Customer> <Order> ... </Order> <Order> ... </Order> ... <Customer>...</Customer> <Order> ... </Order> <Order> ... </Order> ... ... </AllCustomers>
XML 一括読み込みでは、この <Order> 要素が無視されます。ただし、スキーマで sql:overflow-field注釈によりオーバーフロー列を指定した場合、XML 一括読み込みではこの列にすべての未使用データが保存されます。
CDATA セクションとエンティティ参照は、データベースに保存される前に、同等の文字列に変換されます。
この例では、CDATA セクションによって <City> 要素の値がラップされています。XML 一括読み込みでは、文字列値 ("NY") が抽出されてから、<City> 要素がデータベースに挿入されます。
<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 制約などの制約は作成されません。例外として、リレーションシップの主キーを構成する XML ノードが XML 型の ID (たとえば XSD の場合は type="xsd:ID") として定義されており、かつ SchemaGen に対し SGUseID プロパティが True に設定されている場合は、ID 型のノードから主キーが作成されるだけでなく、マッピング スキーマ リレーションシップから主キー/外部キーのリレーションシップが生成されます。
SchemaGen では、リレーショナル SQL Server スキーマの生成に、XSD スキーマ ファセットと機能拡張は使用されません。
一括読み込みで、SchemaGen プロパティを、たとえば SchemaGen = true のように指定した場合は、指定されたテーブルだけが更新され、共有名のビューは更新されません。
SchemaGen では、注釈付き XSD からリレーショナル スキーマを生成するための基本機能だけが提供されます。ユーザーは必要に応じて、生成されたテーブルを手動で変更する必要があります。
テーブル間に複数のリレーションシップが存在する場合、SchemaGen では 2 つのテーブル間に含まれるすべてのキーを含む単一のリレーションシップの作成が試行されます。この制限は、Transact-SQL エラーの原因となることがあります。
データベースに XML データの一括読み込みを行う場合は、マッピング スキーマ内に、データベース列にマップされる属性または子要素が 1 つ以上存在している必要があります。
XML 一括読み込みを使用して日付値を挿入する場合、値は (-)CCYY-MM-DD((+-)TZ) の形式で指定する必要があります。これは日付の標準の XSD 形式です。
一部のプロパティ フラグは、他のプロパティ フラグと互換性がありません。たとえば、一括読み込みでは Ignoreduplicatekeys=true と Keepidentity=false の同時使用がサポートされていません。Keepidentity=false である場合、一括読み込みではサーバーがキー値を生成する必要があります。各テーブルでは、キーに IDENTITY 制約が設定されている必要があります。サーバーは重複キーを生成しないため、Ignoreduplicatekeys を true に設定する必要はありません。Ignoreduplicatekeys を true に設定しなければならないのは、複数の行があるテーブルに入力データから主キー値をアップロードすることによって主キー値の競合が発生する可能性がある場合だけです。