FOR XML (SQL Server)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
SELECT
クエリは、結果を行セットとして返します。 必要に応じて、SQL クエリに FOR XML
句を指定することで、SQL クエリの正式な結果を XML 形式で取得することができます。 FOR XML
句は、最上位レベルのクエリとサブクエリのいずれでも使用できます。 最上位レベルの FOR XML
句は、SELECT
ステートメント内でのみ使用できます。 サブクエリでは、FOR XML
を INSERT
、UPDATE
、DELETE
ステートメントで使用できます。 FOR XML
は代入ステートメントでも使用できます。
FOR XML
句には、次のモードのうち 1 つを指定します。
RAW
AUTO
EXPLICIT
PATH
RAW
モードでは、SELECT
ステートメントによって返された行セットの行ごとに 1 つの <row>
要素を生成します。 入れ子の FOR XML
XML クエリを記述することで、XML 階層を生成できます。
AUTO
モードは、SELECT
ステートメントがどのように指定されているかに基づき、帰納的な方法で入れ子になった結果の XML を生成します。 生成される XML の構造については最小限の制御しか行えません。 AUTO
モードで帰納的に生成された XML 構造に対して、入れ子になった FOR XML
クエリを作成し、XML 階層を生成することができます。
EXPLICIT
モードでは、XML の構造をより厳密に制御することができます。 属性や要素を自由に組み合わせて、XML の構造を決めることができます。 このモードでは、クエリを実行した結果として生成される行セットに特定の形式を指定する必要があります。 その後、この行セットの形式が、XML の構造にマップされます。 EXPLICIT
モードの利点は、属性と要素を自由に組み合わせることができる点です。また、ラッパーや入れ子にした複雑なプロパティを作成したり、スペースで区切られた値を作成したり (OrderID
属性に注文 ID 値の一覧を渡すなど)、混合コンテンツを作成したりすることもできます。
ただし、EXPLICIT
モードのクエリを記述する作業は複雑になることがあります。 EXPLICIT
モードを使用して階層を生成するのではなく、、入れ子になった FOR XML RAW
、AUTO
、PATH
モード クエリの記述および、TYPE
ディレクティブなど、FOR XML
の新しい機能を利用できます。 このような入れ子にした FOR XML
L クエリでも、EXPLICIT
モードで生成可能な XML を作成することができます。 詳細については、 入れ子になった FOR XML クエリの使用 および FOR XML クエリの TYPE ディレクティブを参照してください。
PATH
モードと入れ子になった FOR XML
クエリの機能を組み合わせると、EXPLICIT
モードと同等の柔軟性が得られます。
これらのモードは、モードが設定されたクエリの実行に限って有効です。 後続のクエリの結果に影響は与えません。
FOR XML
は、FOR BROWSE
句で使用される選択には無効です。
例
次の SELECT
ステートメントは、 Sales.Customer
データベースの Sales.SalesOrderHeader
テーブルおよび AdventureWorks2022
テーブルの情報を取得します。 このクエリでは、 AUTO
句に FOR XML
モードを指定しています。
USE AdventureWorks2022;
GO
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.STATUS
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;
FOR XML 句とサーバー名
FOR XML
句を含む SELECT
ステートメントが、クエリの中で 4 つの部分から構成される名前を指定している場合、クエリがローカル コンピューター上で実行されると、結果の XML ドキュメントにサーバー名は返されません。 しかし、クエリがネットワーク サーバー上で実行されると、4 つの部分から構成される名前でサーバー名が返されます。
たとえば、次のクエリについて考えてみます。
SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2022.Person.Person
FOR XML AUTO;
ローカル サーバー: ServerName
がローカル サーバーの場合、クエリでは次のテキストが返されます。
<AdventureWorks2022.Person.Person LastName="Achong" />
ネットワーク サーバー ServerName
がネットワーク サーバーの場合、クエリでは次のテキストが返されます。
<ServerName.AdventureWorks2022.Person.Person LastName="Achong" />
曖昧さを避ける: 次の別名を指定することによって、このような曖昧さが生じないようにできます。
SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2022.Person.Person x
FOR XML AUTO;
明確なクエリで次のテキストが返されるようになります。
<x LastName="Achong"/>