次の方法で共有


アップデートグラムの概要 (SQLXML 4.0)

アップデートグラムまたは OPENXML Transact-SQL 関数を使用して、既存の XML ドキュメントから Microsoft SQL Server のデータベースを変更 (挿入、更新、または削除) できます。

OPENXML 関数は、既存の XML ドキュメントを細分化し、INSERT、UPDATE、または DELETE ステートメントに渡すことができる行セットを提供することによって、データベースを変更します。 OPENXML では、データベース テーブルに対して直接操作が実行されます。 そのため、OPENXML は、テーブルなどの行セット プロバイダーがソースとして表示される場合に最適です。

OPENXML と同様に、アップデートグラムを使用すると、データベース内のデータを挿入、更新、または削除できます。ただし、アップデートグラムは注釈付き XSD (または XDR) スキーマによって提供される XML ビューに対して機能します。たとえば、更新はマッピング スキーマによって提供される XML ビューに適用されます。 さらに、マッピング スキーマには、対応するデータベース テーブルと列に XML 要素と属性をマップするために必要な情報があります。 アップデートグラムでは、このマッピング情報を使用してデータベースのテーブルと列を更新します。

このドキュメントでは、SQL Server でのテンプレートとマッピング スキーマのサポートについて理解していることを前提としています。 詳細については、「 注釈付き XSD スキーマの概要 (SQLXML 4.0)」を参照してください。 XDR を使用するレガシ アプリケーションについては、「 注釈付き XDR スキーマ (SQLXML 4.0 では非推奨)」を参照してください。

アップデートグラムで必要な名前空間

<sync>、<fore>、<以降>などのアップデートグラム内キーワードは、urn:schemas-microsoft-com:xml-updategram名前空間に存在します。 使用する名前空間プレフィックスは任意です。 このドキュメントでは、 updg プレフィックスは、 updategram 名前空間を表します。

構文の確認

アップデートグラムは、アップデートグラムの構文を形成する<sync><fore>および<>ブロックを含むテンプレートです。 次のコードは、この構文を最も簡単な形式で示しています。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
  <updg:sync [mapping-schema= "AnnotatedSchemaFile.xml"] >  
    <updg:before>  
        ...  
    </updg:before>  
    <updg:after>  
        ...  
    </updg:after>  
  </updg:sync>  
</ROOT>  

次の定義では、これらの各ブロックの役割について説明します。

<以前は>
レコード インスタンスの既存の状態 ("前の状態" とも呼ばれます) を識別します。

<後>
データを変更する新しい状態を識別します。

<同期>
<fore> および <after> ブロックを格納します。 <sync> ブロックには、<fore> 以降>ブロックの複数のセット<含めることができます。 < >以降<>ブロックのセットが複数存在する場合はこれらのブロック (空の場合でも) をペアとして指定する必要があります。 さらに、アップデートグラムには複数の <sync> ブロックを含めることができます。 各 <sync> ブロックはトランザクションの 1 単位です (つまり、<sync> ブロック内のすべての処理が行われるか、何も行われません)。 アップデートグラムで複数の<sync>ブロックを指定した場合、1 つの<sync>ブロックの障害は他の<sync>ブロックには影響しません。

アップデートグラムがレコード インスタンスを削除、挿入、または更新するかどうかは、<fore> および <after> ブロックの内容によって異なります。

  • レコード インスタンスが <before> ブロックにのみ表示され、 <以降> ブロックに対応するインスタンスがない場合、アップデートグラムは削除操作を実行します。

  • レコード インスタンスが <after> ブロック内にのみ表示され、<before> ブロックに対応するインスタンスがない場合、これは挿入操作です。

  • レコード インスタンスが <before> ブロックに表示され、対応するインスタンスが <after> ブロックにある場合は、更新操作です。 この場合、アップデートグラムは、レコード インスタンスを <after> ブロックで指定された値に更新します。

アップデートグラムでのマッピング スキーマの指定

アップデートグラムでは、マッピング スキーマによって提供される XML 抽象化 (XSD スキーマと XDR スキーマの両方がサポートされています) は、暗黙的または明示的に指定できます (つまり、アップデートグラムは、指定されたマッピング スキーマの有無にかかわらず機能します)。 マッピング スキーマを指定しない場合、アップデートグラムは暗黙的なマッピング (既定のマッピング) を前提とします。ここで、<fore> ブロックまたは<以降の各要素>ブロックはテーブルにマップされ、各要素の子要素または属性はデータベース内の列にマップされます。 マッピング スキーマを明示的に指定する場合、アップデートグラム内の要素と属性は、マッピング スキーマの要素と属性と一致する必要があります。

暗黙的な (既定) マッピング

ほとんどの場合、単純な更新を実行するアップデートグラムでは、マッピング スキーマは必要ありません。 この場合、アップデートグラムは既定のマッピング スキーマに依存します。

次のアップデートグラムは、暗黙的なマッピングを示しています。 この例では、アップデートグラムによって Sales.Customer テーブルに新しい顧客が挿入されます。 このアップデートグラムでは暗黙的なマッピングが使用されるため、 <Sales.Customer> 要素は Sales.Customer テーブルにマップされ、CustomerID 属性と SalesPersonID 属性は Sales.Customer テーブル内の対応する列にマップされます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
<updg:before>  
</updg:before>  
<updg:after>  
    <Sales.Customer CustomerID="1" SalesPersonID="277" />  
    </updg:after>  
</updg:sync>  
</ROOT>  

明示的なマッピング

マッピング スキーマ (XSD または XDR) を指定した場合、アップデートグラムはスキーマを使用して、更新するデータベース テーブルと列を決定します。

アップデートグラムが複雑な更新を実行する場合 (たとえば、マッピング スキーマで指定されている親子リレーションシップに基づいて複数のテーブルにレコードを挿入する場合)、アップデートグラムを実行する mapping-schema 属性を使用して、マッピング スキーマを明示的に指定する必要があります。

アップデートグラムはテンプレートであるため、アップデートグラム内のマッピング スキーマに指定されたパスは、テンプレート ファイルの場所 (アップデートグラムが格納されている場所を基準とする相対パス) に対して相対的です。 詳細については、「 アップデートグラムでの注釈付きマッピング スキーマの指定 (SQLXML 4.0)」を参照してください。

アップデートグラムでの要素中心および属性中心のマッピング

既定のマッピング (アップデートグラムでマッピング スキーマが指定されていない場合) では、アップデートグラム要素はテーブルと子要素 (要素中心マッピングの場合) にマップされ、属性 (属性中心マッピングの場合) は列にマップされます。

要素中心のマッピング

要素中心のアップデートグラムでは、要素には要素のプロパティを示す子要素が含まれています。 例として、次のアップデートグラムを参照してください。 <Person.Contact> 要素には、**<FirstName>**と<LastName>子要素が含まれています。 これらの子要素は、<Person.Contact> 要素のプロパティです。

このアップデートグラムではマッピング スキーマが指定されていないため、アップデートグラムでは暗黙的なマッピングが使用されます。ここで、<Person.Contact> 要素は Person.Contact テーブルにマップされ、その子要素は FirstName 列と LastName 列にマップされます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:after>  
    <Person.Contact>  
       <FirstName>Catherine</FirstName>  
       <LastName>Abel</LastName>  
    </Person.Contact>  
  </updg:after>  
</updg:sync>  
</ROOT>  

属性中心のマッピング

属性中心のマッピングでは、要素には属性があります。 次のアップデートグラムでは、属性中心のマッピングを使用します。 この例では、 <Person.Contact> 要素は FirstName 属性と LastName 属性で構成されています。 これらの属性は、<Person.Contact> 要素のプロパティです。 前の例と同様に、このアップデートグラムはマッピング スキーマを指定しないため、暗黙的なマッピングに依存して、<Person.Contact> 要素を Person.Contact テーブルにマップし、要素の属性をテーブル内の各列にマップします。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:before>  
  </updg:before>  
  <updg:after>  
    <Person.Contact FirstName="Catherine" LastName="Abel" />  
  </updg:after>  
</updg:sync>  
</ROOT>  

要素中心マッピングと属性中心マッピングの両方の使用

次のアップデートグラムに示すように、要素中心と属性中心のマッピングの組み合わせを指定できます。 <Person.Contact> 要素に属性と子要素の両方が含まれていることに注意してください。 また、このアップデートグラムは暗黙的なマッピングに依存します。 したがって、 FirstName 属性と <LastName> 子要素は、Person.Contact テーブル内の対応する列にマップされます。

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">  
<updg:sync >  
  <updg:before>  
  </updg:before>  
  <updg:after>  
    <Person.Contact FirstName="Catherine" >  
       <LastName>Abel</LastName>  
    </Person.Contact>  
  </updg:after>  
</updg:sync>  
</ROOT>  

SQL Server では有効ですが、XML では無効な文字の操作

SQL Server では、テーブル名にスペースを含めることができます。 ただし、この種類のテーブル名は XML では無効です。

有効な SQL Server 識別子であるが有効な XML 識別子ではない文字をエンコードするには、エンコード値として "__xHHHH__" を使用します。HHHH は、文字の 4 桁の 16 進数 UCS-2 コードを最上位ビット優先順で表します。 このエンコード方式を使用すると、スペース文字が x0020 (スペース文字の 4 桁の 16 進数コード) に置き換えられます。したがって、SQL Server のテーブル名 [Order Details] は XML で_x005B_Order_x0020_Details_x005D_になります。

同様に、 <[database]など、3 部構成の要素名を指定する必要がある場合があります。owner]。[table]>。 角かっこ ([ および ]) は XML では無効であるため、 <_x005B_database_x005D_._x005B_owner_x005D_._x005B_table_x005D_>として指定する必要があります。ここで、_x005B_は左角かっこ ([) のエンコードで、_x005D_は右角かっこ (]) のエンコードです。

アップデートグラムの実行

アップデートグラムはテンプレートであるため、テンプレートのすべての処理メカニズムがアップデートグラムに適用されます。 SQLXML 4.0 では、次のいずれかの方法でアップデートグラムを実行できます。

  • ADO コマンドで送信します。

  • OLE DB コマンドとして送信します。

こちらもご覧ください

アップデートグラムのセキュリティに関する考慮事項 (SQLXML 4.0)