FOR XML クエリのxml
データ型と TYPE ディレクティブを使用すると、FOR XML クエリによって返される XML をサーバーおよびクライアントで処理できます。
xml 型変数を使用した処理
FOR XML クエリの結果を xml
型変数に割り当てたり、XQuery を使用して結果を照会したり、その結果を xml
型変数に割り当てて処理を増やすことができます。
DECLARE @x xml
SET @x=(SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE)
SELECT @x
-- Result
--<row ProductModelID="122" Name="All-Purpose Bike Stand" />
--<row ProductModelID="119" Name="Bike Wash" />
さらに、xml
データ型のいずれかのメソッドを使用して、変数@x
で返された XML を処理できます。 たとえば、value() メソッドを使用してProductModelID
属性値を取得できます。
DECLARE @i int;
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));
SELECT @i;
次の例では、TYPE
ディレクティブが FOR XML
句で指定されているため、FOR XML
クエリの結果はxml
型として返されます。
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot');
結果を次に示します。
<myRoot>
<row ProductModelID="122" Name="All-Purpose Bike Stand" />
<row ProductModelID="119" Name="Bike Wash" />
</myRoot>
結果は xml
型であるため、次のクエリに示すように、この XML に対して xml
データ型メソッドのいずれかを直接指定できます。 クエリでは、query() メソッド (xml データ型) を使用して、<myRoot
>要素の最初の<row
>要素の子を取得します。
SELECT (SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');
結果を次に示します。
<row ProductModelID="122" Name="All-Purpose Bike Stand" />
内部 FOR XML クエリ結果を xml 型インスタンスとして外部クエリに返す
入れ子になった FOR XML
クエリを記述して、内側のクエリの結果を外部クエリに xml
型として返すことができます。 例えば次が挙げられます。
SELECT Col1,
Col2,
( SELECT Col3, Col4
FROM T2
WHERE T2.Col = T1.Col
...
FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;
上のクエリに関して、次の点に注意してください。
内部
FOR XML
クエリによって生成された XML は、外部FOR XML
によって生成された XML に追加されます。内部クエリは、
TYPE
ディレクティブを指定します。 したがって、内部クエリによって返される XML データはxml
型です。 TYPE ディレクティブが指定されていない場合、内部FOR XML
クエリの結果はnvarchar(max)
として返され、XML データはエンティティ化されます。
結果の XML データの形状を制御する
入れ子になった FOR XML クエリを使用すると、結果の XML データの形状をより詳細に定義できます。 入れ子になった FOR XML クエリを使用して、一部は属性中心で要素中心の XML を構築できます。
入れ子になった FOR XML クエリで属性中心の XML と要素中心の XML の両方を指定する方法の詳細については、「 FOR XML クエリと入れ子になった FOR XML クエリの比較」および「入れ子になったFOR XML クエリを使用した図形 XML」を参照してください。
入れ子になった AUTO モード FOR XML クエリを指定することで、兄弟を含む XML 階層を生成できます。 詳細については、「 入れ子になった AUTO モード クエリを使用して兄弟を生成する」を参照してください。
使用するモードに関係なく、入れ子になった FOR XML クエリでは、結果の XML の形状をより詳細に記述できます。 EXPLICIT モードのクエリの代わりに使用できます。
例示
次のトピックでは、入れ子になった FOR XML クエリの例を示します。
FOR XML クエリと入れ子になった FOR XML クエリの比較
単一レベルの FOR XML クエリと入れ子になった FOR XML クエリを比較します。 この例では、クエリの結果として属性中心と要素中心の XML の両方を指定する方法を示します。
入れ子になった AUTO モード クエリを使用して兄弟を生成する
入れ子になった AUTO モードのクエリを使用して兄弟を生成する方法を示します
ASP.NET で入れ子になった FOR XML クエリを使用する
ASPX アプリケーションで FOR XML を使用して SQL Server から XML を返す方法を示します。
ネストされた FOR XML クエリを用いた XML の形成
入れ子になった FOR XML クエリを使用して、SQL Server によって作成された XML ドキュメントの構造を制御する方法を示します。