FOR XML
53.00K
Категория: ПрограммированиеПрограммирование

Форма конечного дерева XML. For XML

1. FOR XML

RAW

2.

• [ FOR { BROWSE | <XML> } ]
• <XML> ::= XML
• {
• { RAW [ ('ElementName') ] | AUTO }
• [
• <CommonDirectives> [ , { XMLDATA | XMLSCHEMA [
('TargetNameSpaceURI') ]} ]
• [ , ELEMENTS [ XSINIL | ABSENT ]
• ]
• | EXPLICIT [ <CommonDirectives> [ , XMLDATA ]
• ]
• | PATH [ ('ElementName') ]
• [ <CommonDirectives> [ , ELEMENTS [ XSINIL |
ABSENT ] ]
• ]
• }
• <CommonDirectives> ::= [ , BINARY BASE64 ]
• [ , TYPE ]
• [ , ROOT [ ('RootName') ] ]

3.


RAW[('ElementName')]
– Берет результаты запроса и преобразует каждую строку в результирующем
наборе в элемент XML с универсальным идентификатором <row /> в качестве
тега элемента. При использовании этой директивы можно дополнительно
указать имя для элемента строки. Полученный в результате XML-документ будет
использовать указанное имя ElementName в качестве элемента,
сформированного для каждой строки. .
AUTO
– Возвращает результаты запроса в виде простого вложенного дерева
XML. Каждая таблица в предложении FROM, в которой хотя бы один столбец
перечислен в предложении SELECT, представлена в виде элемента
XML. Столбцы, перечисленные в предложении SELECT, сопоставлены с
соответствующими атрибутами элемента.
EXPLICIT
– Указывает, что форма конечного дерева XML определена явно. В этом режиме
запросы должны быть составлены особым образом, при котором необходимые
данные о вложенности определяются явно.
PATH
– Предоставляет более простой способ смешивания элементов и атрибутов, а
также введения дополнительной вложенности для представления сложных
свойств. Чтобы создать такой тип XML из набора строк, можно использовать
запросы режима FOR XML EXPLICIT, однако режим PATH представляет собой
более простую альтернативу потенциально громоздким запросам режима
EXPLICIT. Режим PATH дополнительно к возможности записи вложенных
запросов FOR XML и возвращения экземпляров типа xml с помощью директивы
TYPE позволяет писать менее сложные запросы. Он является альтернативой
написанию большинства запросов в режиме EXPLICIT. По умолчанию режим
PATH формирует упаковщик элемента <row> для каждой строки в
результирующем наборе. Также можно указать имя элемента. Если имя
указывается, оно используется в качестве имени упаковщика элемента. При
предоставлении пустой строки (FOR XML PATH ('')) упаковщик элемента не
формируется. Дополнительные сведения см. в разделе

4.


XMLDATA
– Указывает, что будет возвращена встроенная XDR-схема. Эта схема присоединяется
к документу в качестве встроенной схемы.
XMLSCHEMA
– Возвращает встроенную XML-схему W3C (XSD). Также при определении этой
директивы можно указать целевой URI пространства имен. При этом в схему
возвращается указанное пространство имен.
ELEMENTS
– Если указан параметр ELEMENTS, столбцы возвращаются в виде вложенных
элементов. В противном случае они сопоставляются с XML-атрибутами. Этот
параметр поддерживается только режимами RAW, AUTO и PATH. Пи использовании
этой директивы можно дополнительно указать ключевые слова XSINIL или
ABSENT. Ключевое слово XSINIL указывает на то, что элемент имеет атрибут xsi:nil,
установленный в значение True для столбцов со значением NULL. По умолчанию или
при указании вместе с параметром ELEMENTS ключевого слова ABSENT, для
значений NULL столбцы не создаются.
BINARY BASE64
– Если указан параметр BINARY Base64, любые двоичные данные, возвращенные
запросом, будут представлены в формате base64. Чтобы получить двоичные данные
при помощи режимов RAW и EXPLICIT, необходимо указать этот параметр. В режиме
AUTO двоичные данные возвращаются по умолчанию.
TYPE
– Указывает на то, что запрос возвращает результаты в виде типа xml .
ROOT [('RootName')]
– Указывает, что к результирующему XML-документу будет добавлен один элемент
верхнего уровня. Дополнительно можно указать имя корневого элемента, который
необходимо сформировать. Значение по умолчанию — «root».

5.

Режим RAW преобразует каждую строку из
результирующего набора запроса в элемент XML,
обладающий универсальным идентификатором
<row> или при необходимости заданный именем
элемента. По умолчанию каждое значение столбца в
наборе строк, не имеющее значение NULL,
сопоставлено с определенным атрибутом элемента
<row>. Если директива ELEMENTS добавляется в
предложение FOR XML, то каждому значению
столбца сопоставляется подэлемент элемента <row>.
Вместе с директивой ELEMENTS можно
дополнительно определить параметр XSINIL для
сопоставления значений NULL столбца в
результирующем наборе с элементом, обладающим
атрибутом xsi:nil="true".
Есть возможность сделать запрос схемы итогового
XML. При определении параметра XMLDATA
возвращается встроенная схема XDR. При задании
параметра XMLSCHEMA возвращается встроенная
XSD-схема. Схема появляется в начале данных. В
итоге ссылка на пространство имен схемы будет
повторяться для каждого элемента высшего уровня.

6.

• Запросы, приведенные в следующих примерах,
показывают, как работает режим FOR XML RAW с
различными параметрами. Многие из этих запросов
являются запросами к XML-документам с
инструкциями по производству велосипедов,
хранящимися в
столбце Instructions таблицы ProductModel.
A.Получение сведений о модели продукта в формате
XML
• SELECT ProductModelID, Name FROM ProductModel
• WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW;
• Промежуточный результат:
• <row ProductModelID="122" Name="All-Purpose Bike
Stand" />
• <row ProductModelID="119" Name="Bike Wash" />

7.

Есть возможность получить XML-документ с данными
по элементам при помощи определения
директивы ELEMENTS.
SELECT ProductModelID, Name FROM PProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, ELEMENTS;
Результат:
• <row> <ProductModelID>122</ProductModelID>
<Name>All-Purpose Bike Stand</Name>
• </row>
• <row> <ProductModelID>119</ProductModelID>
<Name>Bike Wash</Name>
• </row>

8.

При необходимости можно задать директиву TYPE для
получения результатов в виде xml.
Директива TYPE не изменяет содержимое
результата. Изменяется только тип данных
результата.
• SELECT ProductModelID, Name FROM ProductModel
• WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE ;
Определение XSINIL вместе с директивой
ELEMENTS
приводит к созданию элементов для значений NULL
столбцов
В этом запросе задается директива ELEMENTS для
создания из результата запроса XML-документа с
данными по элементам.
• SELECT ProductID, Name, Color FROM Product
• FOR XML RAW, ELEMENTS

9.

• row>
• <ProductID>1</ProductID>
• <Name>Adjustable Race</Name>
• </row>
• ...
• <row> <ProductID>317</ProductID>
• <Name>LL Crankarm</Name>
• <Color>Black</Color>
• </row>
Так как в элементы столбца Color для некоторых продуктов
имеют значения NULL, то в этих случаях в итоговом XMLдокументе не будет создаваться соответствующий
элемент <Color>. Путем добавления к
директиве ELEMENTS директивы XSINIL можно создать
элемент <Color> даже для значений столбца Color
результирующего набора, равных NULL.

10.

SELECT ProductID, Name, Color FROM Product
FOR XML RAW, ELEMENTS XSINIL
• <row
xmlns:xsi="http://www.w3.org/2001/XMLSchema
-instance">
• <ProductID>1</ProductID>
• <Name>Adjustable Race</Name>
• <Color xsi:nil="true" />
• </row> ...
• <row> <ProductID>317</ProductID>
• <Name>LL Crankarm</Name>
• <Color>Black</Color>
• </row>

11.

Запрос схем для результатов при помощи параметров XMLDATA и
XMLSCHEMA
В следующем запросе возвращается схема XML-DATA, описывающая структуру
документа.
• SELECT ProductModelID, Name
• FROM ProductModel
• WHERE ProductModelID=122 or ProductModelID=119
• FOR XML RAW, XMLDATA GO
• Результат:
• <Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes">
• <ElementType name="row" content="empty" model="closed"> <AttributeType
name="ProductModelID" dt:type="i4" />
• <AttributeType name="Name" dt:type="string" />
<attribute type="ProductModelID" />
<attribute type="Name" />
• </ElementType>
• </Schema>
• <row xmlns="x-schema:#Schema1" ProductModelID="122" Name="All-Purpose
Bike Stand" />
• <row xmlns="x-schema:#Schema1" ProductModelID="119" Name="Bike Wash"
/>

12.

Задавая параметр XMLSCHEMA, можно произвести
запрос XSD-схемы документа.
• SELECT ProductModelID, Name FROM ProductModel
• WHERE ProductModelID=122 or ProductModelID=119
• FOR XML RAW, XMLSCHEMA
• Результат:
• <xsd:schema targetNamespace="urn:schemasmicrosoft-com:sql:SqlRowSet1"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/
2004/sqltypes" elementFormDefault="qualified">
• ………….
• </xsd:schema>
• <row xmlns="urn:schemas-microsoftcom:sql:SqlRowSet1" ProductModelID="122"
Name="All-Purpose Bike Stand" />
• <row xmlns="urn:schemas-microsoftcom:sql:SqlRowSet1" ProductModelID="119"
Name="Bike Wash" />

13.

Переименование элемента <row>
Для каждой строки результирующего набора режим
RAW создает элемент <row>. При необходимости
можно задать другое имя для этого элемента путем
определения дополнительного аргумента в
режиме RAW, как показано в данном запросе. Запрос
возвращает элемент <ProductModel> для каждой
строки из набора строк.
• SELECT ProductModelID, Name
• FROM Production.ProductModel WHERE
ProductModelID=122
• FOR XML RAW ('ProductModel'), ELEMENTS
Результат. Из-за того, что в запрос добавлена
директива ELEMENTS, результат состоит из
элементов.
• <ProductModel>
<ProductModelID>122</ProductModelID>
• <Name>All-Purpose Bike Stand</Name>
</ProductModel>

14.

Определение корневого элемента для XML-документа,
созданного FOR XML
Путем определения параметра ROOT в запросе FOR
XML можно выполнить запрос одного элемента
высшего уровня для итогового XML-документа, как
показано в этом запросе. Данный аргумент,
определенный для директивы ROOT, задает имя
корневого элемента.
• SELECT ProductModelID, Name
• FROM ProductModel
• WHERE ProductModelID=122 or ProductModelID=119 or
ProductModelID=115
• FOR XML RAW, ROOT('MyRoot')
Результат:
• <MyRoot>
• <row ProductModelID="122" Name="All-Purpose Bike
Stand" />
• <row ProductModelID="119" Name="Bike Wash" /> <row
ProductModelID="115" Name="Cable Lock" />
• </MyRoot>

15.

• Запрос столбцов типа xml
В следующий запрос включены столбцы типа xml. Запрос
возвращает идентификатор модели продукта, имя и шаги
производства в первом месте из
столбца Instructions типа xml.
• SELECT ProductModelID, Name,
• Instructions.query(' declare namespace
MI="http://schemas.microsoft.com/sqlserver/2004/07/adventure
-works/ProductModelManuInstructions"
/MI:root/MI:Location[1]/MI:step ')
• FROM ProductModel
• FOR XML RAW ('ProductModelData') GO
Ниже показан результат. Следует заметить, что в таблице
содержатся инструкции по производству продукта только
для некоторых моделей продукта. Этапы производства
возвращаются в качества подэлементов элемента
<ProductModelData> в итоговом документе.

16.

• ProductModelData ProductModelID="5" Name="HL
Mountain Frame" />
• <ProductModelData ProductModelID="6" Name="HL
Road Frame" />
• <ProductModelData ProductModelID="7" Name="HL
Touring Frame">
• <MI:step> ... </MI:step>
• <MI:step> ... </MI:step>
• </ProductModelData>
English     Русский Правила