次の方法で共有


アップデートグラムの概要 (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>、<before>、および <after> などのアップデートグラムのキーワードは、urn:schemas-microsoft-com:xml-updategram 名前空間に存在します。 名前空間プレフィックスは、任意のものを使用できます。 このドキュメントでは、updategram 名前空間を表すものとして updg プレフィックスを使用します。

構文の確認

アップデートグラムは、<sync>、<before>、および <after> ブロックが指定されたテンプレートです。アップデートグラムの構文は、これらのブロックで構成されます。 次のコードは、最も単純な構文です。

<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>

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

  • <before>
    レコード インスタンスの既存の状態 ("before 状態") を指定します。

  • <after>
    データの変更後の新しい状態を指定します。

  • <sync>
    <before> と <after> ブロックを格納します。 <sync> ブロックには、<before> と <after> ブロックの組を複数含めることができます。 <before> と <after> ブロックの組が複数ある場合、これらのブロックは (空であっても) 対で指定する必要があります。 アップデートグラムには複数の <sync> ブロックを指定できます。 各 <sync> ブロックは、トランザクション 1 単位となります。つまり、<sync> 内のすべてが実行されるか、何も実行されないかのいずれかです。 アップデートグラムに複数の <sync> ブロックを指定した場合、1 つの <sync> が失敗しても、他の <sync> ブロックに影響はありません。

アップデートグラムでレコード インスタンスを削除、挿入、または更新するかどうかは、<before> と <after> ブロックの内容に依存します。

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

  • レコード インスタンスを <after> ブロックにのみ指定し、対応するインスタンスを <before> ブロックに指定しない場合は、挿入操作が実行されます。

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

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

アップデートグラムでは、暗黙的または明示的に、マッピング スキーマによって XML データを操作できます。つまり、マッピング スキーマを指定しても指定しなくてもアップデートグラムは動作します。マッピング スキーマは XSD と XDR の両方がサポートされています。 マッピング スキーマを指定しない場合、アップデートグラムでは暗黙的なマッピング (既定のマッピング) が行われます。この場合、<before> ブロックまたは <after> ブロック内の各要素はテーブルにマップされ、各要素の子要素または属性はデータベース内の列にマップされます。 マッピング スキーマを明示的に指定する場合、アップデートグラムの要素と属性は、マッピング スキーマ内の要素と属性に一致する必要があります。

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

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

次のアップデート グラムは、暗黙的なマッピングを示しています。 この例では、アップデートグラムによって新しい顧客が 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 は、その文字の 16 進数 UCS-2 コードの 4 桁を最上位ビットから順に表したものです。 このエンコード方法を使用すると、スペース文字は x0020 (スペース文字を表す 4 桁の 16 進コード) に置き換えられます。したがって、SQL Server のテーブル名 [Order Details] は、XML では _x005B_Order_x0020_Details_x005D_ になります。

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

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

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

  • ADO コマンドに含めて送信する。

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

関連項目

参照

アップデートグラムのセキュリティに関する注意点 (SQLXML 4.0)