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


Создание XML с помощью предложения FOR XML

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

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

  • RAW

  • AUTO

  • EXPLICIT

  • PATH

В режиме RAW создается одиночный элемент <row> для каждой строки набора строк, возвращенного инструкцией 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 более простым образом.

Эти режимы на самом деле работают только при выполнении запросов, для которых они установлены. Они не влияют на результаты любых последующих запросов.

Предложения COMPUTE BY и FOR BROWSE

Предложение FOR XML недопустимо для выборки с использованием предложений COMPUTE BY или FOR BROWSE. Например, следующий запрос возвращает ошибку:

SELECT TOP 5 SalesOrderID, UnitPrice 
FROM Sales.SalesOrderDetail 
ORDER BY SalesOrderID COMPUTE SUM(UnitPrice) BY SalesOrderID
FOR XML AUTO

Предложение FOR XML и имена сервера

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

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

SELECT TOP 1 LastName
FROM ServerName.AdventureWorks.Person.Contact
FOR XML AUTO

Если ServerName — локальный сервер, результат запроса будет таким:

<AdventureWorks.Person.Contact LastName="Achong" />

Если ServerName — сетевой сервер, результат запроса будет таким:

<ServerName.AdventureWorks.Person.Contact LastName="Achong" />

Этой возможной неоднозначности можно избежать с помощью такого псевдонима:

SELECT TOP 1 LastName
FROM ServerName.AdventureWorks.Person.Contact x
FOR XML AUTO 

Результат этого запроса будет таким:

<x LastName="Achong"/>