Использование вложенных запросов FOR XML

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Тип данных xml и директива TYPE в запросах FOR XML позволяют обрабатывать XML-документы, возвращаемые запросами FOR 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 . Например, с помощью метода ProductModelID value() можно получить значение атрибута.

DECLARE @i int;
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));
SELECT @i;

В следующем примере результат запроса FOR XML возвращается в виде типа данных xml , так как в предложении TYPE указана директива FOR 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 , как показано в следующем запросе. В запросе метод query() (xml Data Type) используется для получения первого <row> дочернего <myRoot> элемента элемента.

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;

Обратите внимание на следующие данные из предыдущего запроса:

  • XML-данные, сформированные внутренним запросом FOR XML , добавляются к XML-результату внешнего запроса FOR XML.

  • Во внутреннем запросе указана директива TYPE . Таким образом, возвращаемые внутренним запросом XML-данные имеют тип xml . Если директива TYPE не указана, внутренний запрос FOR XML возвращает результат типа nvarchar(max) и XML-данные преобразуются в сущности.

Управление формой результирующего XML-данных

Вложенные запросы FOR XML предоставляют больше возможностей управления формой результирующих XML-данных. При помощи вложенных запросов FOR XML можно конструировать XML-данные, сочетающие в себе атрибутивную и элементную модели.

Дополнительные сведения об указании атрибутивного и элементного XML с помощью вложенных запросов FOR XML см. в разделах Сравнение запросов FOR XML и вложенных запросов FOR XML и Формирование XML-кода с вложенными запросами FOR XML.

С помощью вложенных запросов FOR XML в режиме AUTO можно формировать XML-иерархии, содержащие одноуровневые элементы. Дополнительные сведения см. в разделе Формирование одноуровневых элементов с помощью вложенного запроса в режиме AUTO.

Независимо от используемого режима вложенные запросы FOR XML предоставляют больший контроль при описании формата результирующих XML-данных. Их можно использовать вместо запросов в режиме EXPLICIT.

Примеры

В следующих разделах содержатся примеры использования запросов FOR XML.