次の方法で共有


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 XMLINSERTUPDATEDELETE ステートメントで使用できます。 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 RAWAUTOPATH モード クエリの記述および、TYPE ディレクティブなど、FOR XML の新しい機能を利用できます。 このような入れ子にした FOR XMLL クエリでも、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"/>