次の方法で共有


XML 一括読み込みのガイドラインと制限事項 (SQLXML 4.0)

XML 一括読み込みを使用する場合は、次のガイドラインと制限事項に精通している必要があります。

  • インライン スキーマはサポートされていません。

    ソース XML ドキュメントにインライン スキーマがある場合、XML 一括読み込みではそのスキーマは無視されます。 XML データの外部の XML 一括読み込みのマッピング スキーマを指定します。 xmlns="x:schema" 属性を使用してノードでマッピング スキーマを指定することはできません。

  • XML ドキュメントが整形式かどうかを確認しますが、検証されません。

    XML 一括読み込みでは、XML ドキュメントが整形式であるかどうかを確認し、XML が World Wide Web Consortium の XML 1.0 の推奨事項の構文要件に準拠していることを確認します。 ドキュメントが整形式でない場合、XML 一括読み込みでは処理がキャンセルされ、エラーが返されます。 唯一の例外は、ドキュメントがフラグメントである場合 (たとえば、ドキュメントにルート要素が 1 つもない場合)、XML 一括読み込みによってドキュメントが読み込まれる場合です。

    XML 一括読み込みでは、XML データ ファイル内で定義または参照されている XML-Data または DTD スキーマに関してドキュメントは検証されません。 また、XML 一括読み込みでは、指定されたマッピング スキーマに対して XML データ ファイルは検証されません。

  • XML プロローグ情報は無視されます。

    XML 一括読み込みでは、XML ドキュメント内の <root> 要素の前後のすべての情報が無視されます。 たとえば、XML 一括読み込みでは、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> 要素を含む別の XML ソース データ ファイルについて考えてみましょう。 これらの要素は、マッピング スキーマでは説明されていません。

    <AllCustomers>  
      <Customer>...</Customer>  
        <Order> ... </Order>  
        <Order> ... </Order>  
         ...  
      <Customer>...</Customer>  
        <Order> ... </Order>  
        <Order> ... </Order>  
         ...  
      ...  
    </AllCustomers>  
    

    XML 一括読み込みでは、これらの <Order> 要素は無視されます。 ただし、スキーマで sql:overflow-fieldコメントを使用して列をオーバーフロー列として識別する場合、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 形式です。

  • 一部のプロパティ フラグは、他のプロパティ フラグと互換性がありません。 たとえば、一括読み込みでは、Keepidentity=falseと共にIgnoreduplicatekeys=trueはサポートされません。 Keepidentity=falseすると、一括読み込みでは、サーバーがキー値を生成することが想定されます。 テーブルには、キーに対する IDENTITY 制約が必要です。 サーバーは重複するキーを生成しないため、 Ignoreduplicatekeystrue に設定する必要はありません。 Ignoreduplicatekeys は、受信データから行を含むテーブルに主キー値をアップロードし、主キー値が競合する可能性がある場合にのみ、 true に設定する必要があります。