Share via


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

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

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

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

ms172697.note(ja-jp,SQL.90).gifメモ :
このドキュメントは、SQL Server 2005 でサポートされるテンプレートとマッピング スキーマについて理解していることを前提としています。詳細については、「注釈付き 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.Contract テーブル内の対応する列にマップされます。

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

ヘルプおよび情報

SQL Server 2005 の参考資料の入手