Поделиться через


FOR XML (SQL Server)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

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

  • RAW
  • AUTO
  • EXPLICIT
  • PATH

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

Режим AUTO создает вложение в результирующий XML с помощью эвристики в зависимости от способа SELECT указания инструкции. Управление формой создаваемой XML структуры минимально. Вложенные FOR XML запросы можно записать для создания XML-иерархии за пределами AUTO 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 предложением указывает четырехкомпонентное имя в запросе, имя сервера не возвращается в результирующем 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"/>