如 FOR XML (SQL Server)中所述,AUTO 模式将查询结果作为嵌套 XML 元素返回。 这不会对从查询结果生成的 XML 形状进行太多控制。 如果要生成简单的层次结构,则 AUTO 模式查询非常有用。 但是, 将 EXPLICIT 模式与 FOR XML 配合使用,将PATH 模式与 FOR XML 配合使用 ,在从查询结果决定 XML 形状方面提供了更多控制和灵活性。
FROM 子句中的每个表(SELECT 子句中至少列出一列)都表示为 XML 元素。 如果 FOR XML 子句中指定了可选 ELEMENTS 选项,SELECT 子句中列出的列将映射到属性或子元素。
生成的 XML 中的元素嵌套层次结构是依据 SELECT 子句中指定列所对应的表的顺序。 因此,SELECT 子句中指定列名称的顺序非常重要。 第一个最左侧的表标识构成生成的 XML 文档中的顶部元素。 在 SELECT 语句中由列标识的第二个最左边的表格形成顶部元素内的一个子元素,依此类推。
如果 SELECT 子句中列出的列名来自一个表,并且该表已由 SELECT 子句中先前指定的列进行了标识,该列将作为现有元素的属性添加,而不是打开新的层级关系。 如果指定了 ELEMENTS 选项,则列将添加为属性。
例如,执行此查询:
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO
下面是部分结果:
<Cust CustomerID="1" CustomerType="S">
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />
</Cust>
...
请注意 SELECT 子句中的以下内容:
CustomerID 引用 Cust 表。 因此,将创建一个 <
Cust> 元素,并添加 CustomerID 作为其属性。接下来,有三列:OrderHeader.CustomerID、OrderHeader.SaleOrderID 和 OrderHeader.Status,引用 OrderHeader 表。 因此,将<
OrderHeader>元素作为<Cust>元素的子元素添加,并将这三列作为<OrderHeader>的属性添加。接下来,Cust.CustomerType 列再次引用了 Cust 表,该表之前已通过 Cust.CustomerID 列标识。 因此,不会创建任何新元素。 而是将 CustomerType 属性添加到 <
Cust> 之前创建的元素。查询语句为表名指定别名。 这些别名显示为相应的元素名称。
ORDER BY 是必须的,以便将所有子级分组到一个父级下。
此查询类似于上一个查询,只不过 SELECT 子句指定了 OrderHeader 表的列,而不是 Cust 表的列。 因此,先创建第一个 <OrderHeader> 元素, <Cust> 然后将子元素添加到其中。
select OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerID,
Cust.CustomerType
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
where Cust.CustomerID = OrderHeader.CustomerID
for xml auto
下面是部分结果:
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">
<Cust CustomerID="1" CustomerType="S" />
</OrderHeader>
...
如果在 FOR XML 子句中添加 ELEMENTS 选项,则返回以元素为中心的 XML。
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO, ELEMENTS
下面是部分结果:
<Cust>
<CustomerID>1</CustomerID>
<CustomerType>S</CustomerType>
<OrderHeader>
<CustomerID>1</CustomerID>
<SalesOrderID>43860</SalesOrderID>
<Status>5</Status>
</OrderHeader>
...
</Cust>
...
在这个查询中,创建 <Cust> 元素时,会比较每一行与其下一行的 CustomerID 值,因为 CustomerID 是该表的主键。 如果未将 CustomerID 标识为表的主键,则会将此查询中的所有列值(CustomerID,CustomerType)从一行进行比较。 如果值不同,则会向 XML 添加新的 <Cust> 元素。
比较这些列值时,如果要比较的任何列的类型为 文本、 ntext、 image 或 xml,则 FOR XML 假定这些值不同且不进行比较,即使它们可能相同。 这是因为不支持比较大型对象。 元素将添加到所选的每一行的结果中。 请注意 ,比较了 (n)varchar(max) 和 varbinary(max) 的列。
如果 SELECT 子句中的列不能与 FROM 子句中标识的任何表相关联,就像聚合列或计算列一样,该列将添加到 XML 文档中最深入的嵌套级别,当在列表中遇到该列时就位。 如果此类列显示为 SELECT 子句中的第一列,则该列将添加到顶部元素。
如果在 SELECT 子句中指定了星号通配符 (*),则嵌套方式与前面所述相同,是根据查询引擎返回行的顺序确定的。
本节中
以下主题提供有关 AUTO 模式的详细信息: