使用 RAW 模式

RAW 模式将查询结果集中的每一行转换为带有通用标识符 <row> 或可能提供元素名称的 XML 元素。默认情况下,行集中非 NULL 的每列值都将映射为 <row> 元素的一个属性。如果将 ELEMENTS 指令添加到 FOR XML 子句,则每个列值都将映射到 <row> 元素的子元素。指定 ELEMENTS 指令之后,您还可以选择性地指定 XSINIL 选项以将结果集中的 NULL 列值映射到具有 xsi:nil="true" 属性的元素。

必须在 FOR XML 子句中指定 BINARY BASE64 选项以使用 base64 编码格式返回二进制数据。在 RAW 模式下,如果不指定 BINARY BASE64 选项就检索二进制数据,将导致错误。

您可以请求返回所产生的 XML 的架构。指定 XMLDATA 选项将返回内联 XDR 架构。指定 XMLSCHEMA 选项将返回内联 XSD 架构。该架构显示在数据的开头。在结果中,每个顶级元素都引用架构命名空间。

示例

下列示例中的查询显示了如何与各个选项一起使用 FOR XML RAW 模式。其中许多查询都按照 ProductModel 表的 Instructions 列中存储的自行车生产说明 XML 文档指定。有关 XML 说明的详细信息,请参阅 AdventureWorks 数据库中的 xml 数据类型表示形式

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

您可以通过指定 ELEMENTS 指令检索以元素为中心的 XML。

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

B. 同时指定 ELEMENTS 和 XSINIL 指令以针对空列值生成元素

以下查询将指定 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 列针对某些产品包含空值,因此生成的 XML 将不会生成对应的 <Color> 元素。通过添加 ELEMENTSXSINIL 指令,甚至可以针对结果集中的 NULL 颜色值生成 <Color> 元素。

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>

C. 使用 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(zh-cn,SQL.90).gif注意:
<Schema> 被声明为命名空间。在不同的 FOR XML 查询中请求多个 XML-Data 架构时,为了避免命名空间冲突,该示例中的命名空间标识符 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 指定为 FOR XML 中 XMLSCHEMA 的可选参数。这将返回架构中指定的目标命名空间。每次执行查询时,此目标命名空间都保持不变。例如,下面的查询是对上面查询的修改,它将命名空间 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" />

D. 检索二进制数据

以下查询将返回在 varbinary(max) 类型列中存储的产品照片。查询中指定了 BINARY BASE64 选项,以返回 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"/>

E. 重命名 <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> 

F. 为 FOR XML 生成的 XML 指定根元素

通过在 FOR XML 查询中指定 ROOT 选项,您可以为生成的 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>

G. 查询 xml 类型的列

以下查询包括 xml 类型的列。该查询从 xml 类型的 Instructions 列的第一个位置检索产品型号 ID、名称和生产步骤。

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>

如果查询为 XQuery 返回的 XML 指定列名(如以下 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 指令。因此,返回的结果以元素为中心。即使行集中的对应列为 NULL,与 ELEMENTS 指令一起指定的 XSINIL 选项仍可以返回 <ManuSteps> 元素。

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>

H. 使用 WITH XMLNAMESPACES 添加命名空间

有关示例,请参阅使用 WITH XMLNAMESPACES 添加命名空间

请参阅

参考

使用 AUTO 模式
使用 EXPLICIT 模式
使用 FOR XML 构造 XML

概念

使用 WITH XMLNAMESPACES 添加命名空间
使用 PATH 模式

其他资源

SELECT (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助