FOR XML (SQL Server)

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

Запрос SELECT возвращает результаты в виде набора строк. При необходимости можно получать результаты SQL-запроса в формате XML. Для этого в запросе необходимо указать предложение FOR XML. Предложение FOR XML может использоваться в запросах верхнего уровня и во вложенных запросах. Предложение FOR XML верхнего уровня можно использовать только в инструкции SELECT. Во вложенных запросах предложение FOR XML можно использовать в инструкциях INSERT, UPDATE и DELETE. FOR XML также можно использовать в инструкциях присваивания.

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

  • НЕОБРАБОТАННЫЕ
  • АВТОМАТИЧЕСКИ
  • EXPLICIT
  • ПУТЬ

Режим RAW создает один <элемент строки> для каждой строки в наборе строк, возвращаемом инструкцией SELECT. XML-иерархию можно создать с помощью написания вложенных запросов FOR XML.

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

Режим EXPLICIT предоставляет больше возможностей по управлению формой XML-структуры. В XML-структуре могут быть использованы смешанные атрибуты и элементы. Это требует особого формата для результирующего набора строк, создаваемого в результате выполнения запроса. Формат этого набора строк затем сопоставляется с формой XML-структуры. Преимущества режима EXPLICIT состоят в возможности использования смешанных атрибутов и элементов, в возможности создания упаковщиков и вложенных составных свойств, создания значений, разделенных пробелами (например, атрибут OrderID может содержать список значений идентификаторов порядка), и смешанного содержимого.

Однако написание запросов в режиме EXPLICIT может быть очень обременительным. Можно использовать некоторые новые возможности предложения FOR XML, например написание вложенных запросов FOR XML в режиме RAW/AUTO/PATH и директивы TYPE вместо использования режима EXPLICIT для создания иерархий. Вложенные запросы FOR XML могут создавать любую XML структуру, которую можно создать с помощью режима EXPLICIT. Дополнительные сведения см. в статьях Использование вложенных запросов FOR XML и Директива TYPE в запросах FOR XML.

Режим 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 и имена сервера

Если в инструкции SELECT, использующей предложение FOR XML, указано четырехкомпонентное имя, в возвращаемом документе имя сервера отсутствует, если запрос выполняется на локальном компьютере. Однако имя сервера возвращается как часть имени, если запрос выполняется на сетевом сервере.

В качестве примера рассмотрим запрос:

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"/>

См. также

Базовый синтаксис предложения FOR XML
Использование RAW Mode с FOR XML
Использование AUTO Mode с FOR XML
Использование режима EXPLICIT совместно с предложением FOR XML
Использование режима PATH совместно с FOR XML
OPENXML (SQL Server)
Добавление пространств имен в запросы с WITH XMLNAMESPACES