次の方法で共有


クライアント側の XML 書式設定 (SQLXML 4.0)

ここでは、クライアント側の XML 書式設定に関する情報を提供します。クライアント側の書式設定とは、中間層での XML の書式設定を指します。

注意

ここでは、クライアント側での FOR XML 句の使用に関する追加情報を提供します。ここでは、FOR XML 句について理解していることを前提としています。FOR XML の詳細については、「FOR XML を使用した XML の構築」を参照してください。

重要   クライアント側の FOR XML 機能で新しい xml データ型を使用するには、クライアントで SQLOLEDB プロバイダーではなく SQL Server Native Client (SQLNCLI10) データ プロバイダーを常に使用する必要があります。SQLNCLI10 は、最新バージョンの SQL Server プロバイダーであり、SQL Server 2005 で導入されたデータ型を完全に認識します。クライアント側の FOR XML に SQLOLEDB プロバイダーを使用すると、xml データ型は文字列として扱われます。

クライアント側での XML ドキュメントの書式設定

クライアント アプリケーションで次のクエリを実行するとします。

SELECT FirstName, LastName
FROM   Person.Person
FOR XML RAW;

この場合、クエリの次の部分だけがサーバーに送信されます。

SELECT FirstName, LastName
FROM   Person.Person

サーバーではクエリが実行され、FirstName 列と LastName列を含む行セットがクライアントに返されます。次に、中間層で、行セットに FOR XML 変換が適用され、XML の書式設定がクライアントに返されます。

同様に、XPath クエリを実行すると、サーバーからクライアントに行セットが返され、クライアント側で行セットに FOR XML EXPLICIT 変換が適用されて、目的の XML の書式設定が生成されます。

次の表は、クライアント側の FOR XML で指定できるモードです。

クライアント側の FOR XML のモード

コメント

RAW

クライアント側とサーバー側のどちらの FOR XML で指定しても、同じ結果が生成されます。

NESTED

サーバー側で FOR XML AUTO モードを指定した場合と同様です。

EXPLICIT

サーバー側で FOR XML EXPLICIT モードを指定した場合と同様です。

注意

AUTO モードを指定してクライアント側の XML 書式設定を要求すると、クエリ全体がサーバーに送信され、XML 書式設定はサーバー側で実行されます。このモードは便利ですが、NESTED モードを指定した場合は、生成される XML ドキュメント内の要素名としてベース テーブル名が返される点に注意してください。使用するアプリケーションによっては、ベース テーブル名が必要です。たとえば、ストアド プロシージャを実行し、結果のデータを Microsoft .NET Framework のデータセットに読み込んだ後で、テーブルのデータを更新する DiffGram を生成するとします。この場合、ベース テーブル情報が必要となるため、NESTED モードを使用する必要があります。

クライアント側の XML 書式設定の利点

次に、クライアント側の XML 書式設定の利点をいくつか紹介します。

サーバーに単一の行セットを返すストアド プロシージャがある場合、クライアント側の FOR XML 変換を要求して XML を生成できる。

たとえば、次のストアド プロシージャを考えてみます。このプロシージャでは、姓と名が AdventureWorks2008R2 データベースの Person.Person テーブルから返されます。

IF EXISTS (SELECT name FROM sys.objects
   WHERE name = 'GetContacts' AND type = 'P')
   DROP PROCEDURE GetContacts;
GO
CREATE PROCEDURE GetContacts
AS
    SELECT   FirstName, LastName
    FROM     Person.Person;

このストアド プロシージャを、次のサンプル XML テンプレートで実行します。このとき、FOR XML 句をストアド プロシージャ名の後に指定します。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <sql:query client-side-xml="1">
    EXEC GetContacts FOR XML NESTED
  </sql:query>
</ROOT>

テンプレートでは client-side-xml 属性が 1 (true) に設定されているため、ストアド プロシージャはサーバーで実行され、サーバーで返された 2 列の行セットが中間層で XML に変換されて、クライアントに返されます。次に示すのは結果の一部です。

 <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Person.Person FirstName="Gustavo" LastName="Achong" /> 
  <Person.Person FirstName="Catherine" LastName="Abel" />
</ROOT>
注意

SQLXMLOLEDB プロバイダー、または SQLXML マネージ クラスを使用している場合は、ClientSideXml プロパティを使用してクライアント側の XML 書式設定を要求できます。

ワークロードをより適切に分散できる。

クライアントで XML 書式設定を行うため、サーバーとクライアント間でワークロードがより適切に分散され、サーバーで他の処理を実行できるようになります。

クライアント側の XML 書式設定のサポート

クライアント側の XML 書式設定機能をサポートするため、SQLXML では次のコンポーネントが提供されます。

  • SQLXMLOLEDB プロバイダー

  • SQLXML マネージ クラス

  • 拡張 XML テンプレートのサポート

  • SqlXmlCommand.ClientSideXml プロパティ

    SQLXML マネージ クラスのこのプロパティを true に設定すると、クライアント側の書式設定を指定できます。

拡張 XML テンプレートのサポート

SQL Server 2005 以降は、SQL Server の XML テンプレートが拡張され、client-side-xml 属性が追加されました。この属性を true に設定すると、XML がクライアント側で書式設定されます。このテンプレート属性は、SQLXMLOLEDB プロバイダー固有の ClientSideXML プロパティと機能的に同じであることに注意してください。

注意

SQLXMLOLEDB プロバイダーを使用する ADO アプリケーションで XML テンプレートを実行し、テンプレートとプロバイダーの ClientSideXML プロパティの両方に client-side-xml 属性を指定している場合は、テンプレートで指定した値が優先されます。