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


Использование режима RAW

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

Параметр BINARY BASE64 необходимо определить в предложении FOR XML для возвращения двоичных данных в base64-кодированном формате. В режиме RAW извлечение двоичных данных без определения параметра BINARY BASE64 приводит к ошибке.

Есть возможность сделать запрос схемы итогового XML. При определении параметра XMLDATA возвращается встроенная схема XDR. При задании параметра XMLSCHEMA возвращается встроенная XSD-схема. Схема появляется в начале данных. В итоге ссылка на пространство имен схемы будет повторяться для каждого элемента высшего уровня.

Примеры

Запросы, приведенные в следующих примерах, показывают, как работает режим FOR XML RAW с различными параметрами. Многие из этих запросов являются запросами к XML-документам с инструкциями по производству велосипедов, хранящимися в столбце Instructions таблицы ProductModel. Дополнительные сведения об инструкциях XML см. в разделе Представление типов xml-данных в базе данных AdventureWorks.

A. Получение сведений о модели продукта в формате XML

Следующий запрос возвращает сведения о модели продукта. Режим RAW указан в предложении FOR XML.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW;
GO

Промежуточный результат:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

<row ProductModelID="119" Name="Bike Wash" />

Есть возможность получить XML-документ с данными по элементам при помощи определения директивы ELEMENTS.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, ELEMENTS;
GO

Результат:

<row>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</row>
<row>
  <ProductModelID>119</ProductModelID>
  <Name>Bike Wash</Name>
</row>

При необходимости можно задать директиву TYPE для получения результатов в виде xml. Директива TYPE не изменяет содержимое результата. Изменяется только тип данных результата.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE ;
GO

Б. Определение XSINIL вместе с директивой ELEMENTS приводит к созданию элементов для значений NULL столбцов

В этом запросе задается директива ELEMENTS для создания из результата запроса XML-документа с данными по элементам.

USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS;
GO

Частичный результат:

<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.

USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.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>

В. Запрос схем для результатов при помощи параметров XMLDATA и XMLSCHEMA

В следующем запросе возвращается схема XML-DATA, описывающая структуру документа.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.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" />
ms175140.note(ru-ru,SQL.90).gifПримечание.
<Schema> задается в качестве пространства имен. Во избежание конфликтов пространств имен при запросе нескольких схем XML-Data различными запросами FOR XML, идентификатор пространства имен (в этом примере это Schema1) изменяется при каждом выполнении запроса. Идентификатор пространства имен определяется как Scheman, где n является целым числом.

Задавая параметр XMLSCHEMA, можно произвести запрос XSD-схемы документа.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA
GO

Результат:

<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="row">
    <xsd:complexType>
      <xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
      <xsd:attribute name="Name" use="required">
        <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
          <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
            <xsd:maxLength value="50" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="119" Name="Bike Wash" />

Можно определить URI целевого пространства имен в качестве дополнительного аргумента XMLSCHEMA в FOR XML. Это задаст определенное целевое пространство имен в схеме. Это целевое пространство имен остается одинаковым при каждом последующем выполнении запроса. Например в следующую измененную версию предыдущего запроса включено в качестве аргумента URI пространства имен 'urn:example.com'.

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA ('urn:example.com')
GO

Результат:

<xsd:schema targetNamespace="urn:example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="row">
    <xsd:complexType>
      <xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
      <xsd:attribute name="Name" use="required">
        <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
          <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
            <xsd:maxLength value="50" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<row xmlns="urn:example.com" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:example.com" ProductModelID="119" Name="Bike Wash" />

Г. Получение двоичных данных

В следующем запросе возвращается фотография продукта, хранящаяся в столбце с типом данных varbinary(max). Для возвращения двоичных данных в base64-кодированном формате для запроса должен быть определен параметр BINARY BASE64.

USE AdventureWorks
GO
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=1
FOR XML RAW, BINARY BASE64 ;
GO

Результат:

<row ProductModelID="1" ThumbNailPhoto="base64 encoded binary data"/>

Д. Переименование элемента <row>

Для каждой строки результирующего набора режим RAW создает элемент <row>. При необходимости можно задать другое имя для этого элемента путем определения дополнительного аргумента в режиме RAW, как показано в данном запросе. Запрос возвращает элемент <ProductModel> для каждой строки из набора строк.

SELECT ProductModelID, Name 
FROM Production.ProductModel
WHERE ProductModelID=122
FOR XML RAW ('ProductModel'), ELEMENTS
GO

Результат. Из-за того, что в запрос добавлена директива ELEMENTS, результат состоит из элементов.

<ProductModel>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</ProductModel> 

Е. Определение корневого элемента для XML-документа, созданного FOR XML

Путем определения параметра ROOT в запросе FOR XML можно выполнить запрос одного элемента высшего уровня для итогового XML-документа, как показано в этом запросе. Данный аргумент, определенный для директивы ROOT, задает имя корневого элемента.

USE AdventureWorks;
GO
SELECT ProductModelID, Name 
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119 or ProductModelID=115
FOR XML RAW, ROOT('MyRoot')
go

Результат:

<MyRoot>
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />
  <row ProductModelID="119" Name="Bike Wash" />
  <row ProductModelID="115" Name="Cable Lock" />
</MyRoot>

Ж. Запрос столбцов типа xml

В следующий запрос включены столбцы типа xml. Запрос возвращает идентификатор модели продукта, имя и шаги производства в первом месте из столбца Instructions типа xml.

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') 
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
GO

Ниже показан результат. Следует заметить, что в таблице содержатся инструкции по производству продукта только для некоторых моделей продукта. Этапы производства возвращаются в качества подэлементов элемента <ProductModelData> в итоговом документе.

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

Если в запросе задано имя столбца для XML-документа, возвращаемого XQuery, так как это задано в следующей инструкции SELECT, то шаги производства помещаются в элемент, имеющий указанное имя.

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
go

Результат:

<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
  <ManuSteps>
    <MI:step ... </MI:step>
    <MI:step ... </MI:step>
  </ManuSteps>
</ProductModelData>

В следующем запросе задана директива ELEMENTS. Поэтому результат будет состоять из элементов. Параметр XSINIL, заданный вместе с директивой ELEMENTS, возвращает элементы <ManuSteps>, даже если соответствующий столбец в наборе строк имеет значение NULL.

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData'), root('MyRoot'), ELEMENTS XSINIL
go

Результат:

<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   ...
  <ProductModelData>
    <ProductModelID>6</ProductModelID>
    <Name>HL Road Frame</Name>
    <ManuSteps xsi:nil="true" />
  </ProductModelData>
  <ProductModelData>
    <ProductModelID>7</ProductModelID>
    <Name>HL Touring Frame</Name>
    <ManuSteps>
      <MI:step ... </MI:step>
      <MI:step ...</MI:step>
       ...
    </ManuSteps>
  </ProductModelData>
</MyRoot>

З. Добавление пространств имен с помощью выражения WITH XMLNAMESPACES

Примеры см. в разделе Добавление пространств имен с помощью предложения WITH XMLNAMESPACES.

См. также

Справочник

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

Основные понятия

Добавление пространств имен с помощью предложения WITH XMLNAMESPACES
Использование режима PATH

Другие ресурсы

SELECT (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005