クライアント側の XML 書式設定 (SQLXML 4.0)
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance
ここでは、クライアント側の XML 書式設定に関する情報を提供します。 クライアント側の書式設定とは、中間層での XML の書式設定を指します。
Note
ここでは、クライアント側での FOR XML 句の使用に関する追加情報を提供します。ここでは、FOR XML 句について理解していることを前提としています。 FOR XML の詳細については、「 FOR XML を使用した XML の再構築」を参照してください。
SQLNCLI11は、SQL Server 2005 (9.x) で導入されたデータ型を完全に理解するための SQL Server プロバイダーの最初のバージョンでした。 SQLOLEDB プロバイダーを使用したクライアント側 FOR XML の動作では、 xml データ型が文字列として扱われます。
重要
SQL Server Native Client (SNAC) は同梱されていません。
- SQL Server 2022 (16.x) 以降のバージョン
- SQL Server Management Studio 19 以降のバージョン
SQL Server Native Client (SQLNCLI または SQLNCLI11) と従来の Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。
新しいプロジェクトの場合は、次のいずれかのドライバーを使用します。
SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、この「サポート ライフサイクルの例外」を参照してください。
クライアント側での XML ドキュメントの書式設定
クライアント アプリケーションで次のクエリを実行するとします。
SELECT FirstName, LastName
FROM Person.Contact
FOR XML RAW
この場合、クエリの次の部分だけがサーバーに送信されます。
SELECT FirstName, LastName
FROM Person.Contact
サーバーはクエリを実行し、行セット (FirstName と LastNamecolumns を含む) をクライアントに返します。 次に、中間層で、行セットに FOR XML 変換が適用され、XML の書式設定がクライアントに返されます。
同様に、XPath クエリを実行すると、サーバーからクライアントに行セットが返され、クライアント側で行セットに FOR XML EXPLICIT 変換が適用されて、目的の XML の書式設定が生成されます。
次の表は、クライアント側の FOR XML で指定できるモードです。
クライアント側の FOR XML のモード | コメント |
---|---|
RAW | クライアント側とサーバー側のどちらの FOR XML で指定しても、同じ結果が生成されます。 |
NESTED | サーバー側で FOR XML AUTO モードを指定した場合と同様です。 |
EXPLICIT | サーバー側で FOR XML EXPLICIT モードを指定した場合と同様です。 |
Note
AUTO モードを指定してクライアント側の XML 書式設定を要求すると、クエリ全体がサーバーに送信され、XML 書式設定はサーバー側で実行されます。 このモードは便利ですが、NESTED モードを指定した場合は、生成される XML ドキュメント内の要素名としてベース テーブル名が返される点に注意してください。 使用するアプリケーションによっては、ベース テーブル名が必要です。 たとえば、ストアド プロシージャを実行し、結果のデータをデータセット (Microsoft .NET Framework) に読み込み、後で DiffGram を生成してテーブル内のデータを更新することができます。 この場合、ベース テーブル情報が必要となるため、NESTED モードを使用する必要があります。
クライアント側の XML 書式設定の利点
次に、クライアント側の XML 書式設定の利点をいくつか紹介します。
サーバーに単一の行セットを返すストアド プロシージャがある場合、クライアント側の FOR XML 変換を要求して XML を生成できる。
たとえば、次のストアド プロシージャを考えてみます。 このプロシージャでは、従業員の姓と名前が AdventureWorks データベースの Person.Contact テーブルから返されます。
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'GetContacts' AND type = 'P')
DROP PROCEDURE GetContacts
GO
CREATE PROCEDURE GetContacts
AS
SELECT FirstName, LastName
FROM Person.Contact
このストアド プロシージャを、次のサンプル 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.Contact FirstName="Gustavo" LastName="Achong" />
<Person.Contact FirstName="Catherine" LastName="Abel" />
</ROOT>
Note
SQLXMLOLEDB プロバイダーまたは SQLXML マネージ クラスを使用している場合は、 ClientSideXml プロパティを使用して、クライアント側の XML 書式設定を要求できます。
ワークロードをより適切に分散できる。
クライアントで XML 書式設定を行うため、サーバーとクライアント間でワークロードがより適切に分散され、サーバーで他の処理を実行できるようになります。
クライアント側の XML 書式設定のサポート
クライアント側の XML 書式設定機能をサポートするため、SQLXML では次のコンポーネントが提供されます。
SQLXMLOLEDB プロバイダー
SQLXML マネージド クラス
拡張 XML テンプレートのサポート
SqlXmlCommand.ClientSideXml プロパティ
SQLXML マネージド クラスのこのプロパティを true に設定すると、クライアント側の書式設定を指定できます。
拡張 XML テンプレートのサポート
SQL Server 2005 (9.x) 以降では、sql Server の XML テンプレートが拡張され、 client-side-xml 属性が追加されました。 この属性を true に設定すると、XML がクライアント側で書式設定されます。 このテンプレート属性は、SQLXMLOLEDB プロバイダー固有の ClientSideXML プロパティと機能が同じであることに注意してください。
Note
SQLXMLOLEDB プロバイダーを使用する ADO アプリケーションで XML テンプレートを実行し、テンプレートに client-side-xml 属性とプロバイダー ClientSideXML プロパティの両方を指定した場合、テンプレートで指定された値が優先されます。
参照
クライアント側とサーバー側の XML 書式設定のアーキテクチャ (SQLXML 4.0)
FOR XML (SQL Server)
FOR XML のセキュリティに関する考慮事項 (SQLXML 4.0)
SQLXML 4.0 での xml データ型のサポート
SQLXML マネージ クラス
クライアント側とサーバー側の XML 書式設定 (SQLXML 4.0)
SqlXmlCommand オブジェクト (SQLXML マネージ クラス)
XML データ (SQL Server)