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 制約が必要です。 サーバーは重複するキーを生成しません。つまり、 Ignoreduplicatekeystrue に設定する必要はありません。 Ignoreduplicatekeystrue に設定する必要があります 行を含むテーブルに受信データから主キー値をアップロードする場合にのみ、主キー値の競合が発生する可能性があります。