アップデートグラムの概要 (SQLXML 4.0)
適用対象: SQL Server Azure SQL データベース
アップデートグラムまたは OPENXML Transact-SQL 関数を使用して、既存の XML ドキュメントから Microsoft SQL Server のデータベースを変更 (挿入、更新、または削除) できます。
OPENXML 関数は、既存の XML ドキュメントを断片化し、INSERT、UPDATE または DELETE ステートメントに渡すことができる行セットを提供することで、データベースを変更する関数です。 OPENXML を使用すると、データベース テーブルに対して操作を直接実行できます。 したがって、ソースにテーブルなどの行セット プロバイダーがある場合は常に、OPENXML を使用するのが最適です。
アップデートグラムを使用すると、OPENXML と同様にデータベースに対してデータを挿入、更新、または削除できます。ただし、アップデートグラムは注釈付き XSD (または XDR) スキーマにより提供される XML ビューに対して動作します。たとえば、更新はマッピング スキーマにより提供される XML ビューに適用されます。 マッピング スキーマには、XML 要素と属性を対応するデータベース テーブルと列にマップするための、必要な情報が含まれています。 アップデートグラムでは、このマッピング情報を使用してデータベース テーブルと列が更新されます。
Note
このドキュメントでは、SQL Server でのテンプレートとマッピング スキーマのサポートについて理解していることを前提としています。 詳細については、「 注釈付き XSD スキーマへの導入 (SQLXML 4.0)」を参照してください。 XDR を使用するレガシ アプリケーションについては、「 Annotated XDR Schemas (SQLXML 4.0 で非推奨)」を参照してください。
アップデートグラムで必要な名前空間
<sync>、<before>、<以降>などのアップデートグラム内のキーワードは、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>
次に、これらの各ブロックの役割について説明します。
<以前は>
レコード インスタンスの既存の状態 ("before 状態") を指定します。
<後>
データの変更後の新しい状態を指定します。
<sync>
<fore> および <after> ブロックを格納します。 <sync> ブロックには、<fore>以降>ブロック<複数のセットを含めることができます。 <>以降<>ブロックのセットが複数存在する場合は、これらのブロック (空の場合でも) をペアとして指定する必要があります。 さらに、アップデートグラムには複数の <sync> ブロックを含めることができます。 各 <sync> ブロックは 1 つのトランザクション単位です (つまり、 <sync> ブロック内のすべての処理が行われるか、何も行われません)。 アップデートグラムで複数の <sync> ブロックを指定した場合、1 つの <sync> ブロックの障害は他の <sync> ブロックには影響しません。
アップデートグラムがレコード インスタンスを削除、挿入、または更新するかどうかは、 <fore> および <after> ブロックの内容によって異なります。
レコード インスタンスが <before> ブロック内にのみ表示され <後> ブロックに対応するインスタンスがない場合、アップデートグラムは削除操作を実行します。
レコード インスタンスが <after> ブロックにのみ表示され、 <before> ブロックに対応するインスタンスがない場合は、挿入操作になります。
レコード インスタンスが <before> ブロックに表示され、 <以降> ブロックに対応するインスタンスがある場合は、更新操作です。 この場合、アップデートグラムは、レコード インスタンスを <after> ブロックで指定された値に更新します。
アップデートグラムでのマッピング スキーマの指定
アップデートグラムでは、暗黙的または明示的に、マッピング スキーマによって XML データを操作できます。つまり、マッピング スキーマを指定しても指定しなくてもアップデートグラムは動作します。マッピング スキーマは XSD と XDR の両方がサポートされています。 マッピング スキーマを指定しない場合、アップデートグラムでは暗黙的なマッピング (既定のマッピング) が想定されます。ここで、 <before> ブロックまたは <以降の各要素> ブロックはテーブルにマップされ、各要素の子要素または属性はデータベース内の列にマップされます。 マッピング スキーマを明示的に指定する場合、アップデートグラムの要素と属性は、マッピング スキーマ内の要素と属性に一致する必要があります。
暗黙的なマッピング (既定)
単純な更新を実行するアップデートグラムではほとんどの場合、マッピング スキーマは必要ありません。 この場合、アップデートグラムは既定のマッピング スキーマに従います。
次のアップデート グラムは、暗黙的なマッピングを示しています。 この例では、アップデートグラムによって新しい顧客が 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 コマンドとして送信する。