Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 数据库中的 XML » 在数据库中使用 XML » 以 XML 格式获取查询结果

 

使用 FOR XML AUTO

AUTO 模式会在 XML 文档中生成嵌套的元素。选择列表中引用的每一个表在生成的 XML 中都会表示为一个元素。嵌套的顺序基于选择列表中引用表的顺序而定。在您指定 AUTO 模式时,会为选择列表中的每个表创建一个元素,而该表中的每一列都是一个单独的属性。

语法
FOR XML AUTO[, ELEMENTS ]
参数

ELEMENTS   让 FOR XML AUTO 为结果中的每一列都生成一个 XML 元素,而不是生成一个属性。例如,

SELECT Employees.EmployeeID, Departments.DepartmentName
FROM Employees JOIN Departments
   ON Employees.DepartmentID=Departments.DepartmentID
ORDER BY EmployeeID
FOR XML AUTO, ELEMENTS;

在本例中,结果集中的每一列都会作为一个单独的元素返回,而不是 <Employees> 元素的一个属性。如果有 NULL 值,生成的 XML 文档中就会忽略该元素。

<Employees>
   <EmployeeID>102</EmployeeID>
   <Departments>
      <DepartmentName>R &amp; D</DepartmentName>
   </Departments>
</Employees> 
<Employees>
   <EmployeeID>105</EmployeeID>
   <Departments>
      <DepartmentName>R &amp; D</DepartmentName>
   </Departments>
</Employees> 
<Employees>
   <EmployeeID>129</EmployeeID>
   <Departments>
   <DepartmentName>Sales</DepartmentName>
   </Departments>
</Employees>
...
用法

在您使用 FOR XML AUTO 执行查询时,BINARY、LONG BINARY、IMAGE 和 VARBINARY 列中的数据会自动以 base64 编码格式返回。缺省情况下,结果中会忽略 NULL 值。通过将 for_xml_null_treatment 选项设置为 EMPTY,您可以将 NULL 值作为空属性返回。

有关设置 for_xml_null_treatment 选项的信息,请参见for_xml_null_treatment 选项 [数据库]

除非另有要求,否则数据库服务器返回表中行的顺序没有任何意义。如果您希望结果按某种特定顺序显示,或者,对于有多个子项的父元素,您必须在查询中加入 ORDER BY 子句,以让所有子项都相邻。如果您不指定 ORDER BY 子句,结果的嵌套就会取决于优化程序所选择的计划,而且您可能得不到需要的嵌套。

FOR XML AUTO 不会返回结构完好的 XML 文档,因为该文档没有单一的根节点。如果需要 <root> 元素,可以使用 XMLELEMENT 函数插入一个。例如,

SELECT XMLELEMENT( NAME root,
                   (SELECT EmployeeID AS id, GivenName AS name
                   FROM Employees FOR XML AUTO ) );

有关 XMLELEMENT 函数的信息,请参见XMLELEMENT 函数 [String]

通过指定别名,您可以更改 XML 文档中使用的属性名或元素名。以下查询会将 ID 属性重命名为 product_ID:

SELECT ID AS product_ID
FROM Products
WHERE Color='Black'
FOR XML AUTO;

生成的 XML 如下:

<Products product_ID="302"/>
<Products product_ID="400"/>
<Products product_ID="501"/>
<Products product_ID="700"/>

您也可以用别名来重命名表。以下查询将表重命名为 product_info:

SELECT ID AS product_ID
FROM Products AS product_info
WHERE Color='Black'
FOR XML AUTO;

生成的 XML 如下:

<product_info product_ID="302"/>
<product_info product_ID="400"/>
<product_info product_ID="501"/>
<product_info product_ID="700"/>
示例

以下查询所生成的 XML 同时包含 <employee> 元素和 <department> 元素,其中,<employee> 元素(在选择列表中列在第一位的表)是 <department> 元素的父项。

SELECT EmployeeID, DepartmentName
FROM Employees AS employee JOIN Departments AS department
   ON Employees.DepartmentID=Departments.DepartmentID
ORDER BY EmployeeID
FOR XML AUTO;

以上查询将生成以下 XML:

<employee EmployeeID="102">
   <department DepartmentName="R &amp; D"/>
</employee>
<employee EmployeeID="105">
   <department DepartmentName="R &amp; D"/>
</employee>
<employee EmployeeID="129">
   <department DepartmentName="Sales;"/>
</employee>
<employee EmployeeID="148">
   <department DepartmentName="Finance;"/>
</employee>
...

如果您按以下所示更改选择列表中列的顺序:

SELECT DepartmentName, EmployeeID
FROM Employees AS employee JOIN Departments AS department
   ON Employees.DepartmentID=Departments.DepartmentID
ORDER BY 1, 2
FOR XML AUTO;

结果会如下所示嵌套:

<department DepartmentName="Finance">
   <employee EmployeeID="148"/>
   <employee EmployeeID="390"/>
   <employee EmployeeID="586"/>
   ...
</department> 
<Department name="Marketing">
   <employee EmployeeID="184"/>
   <employee EmployeeID="207"/>
   <employee EmployeeID="318"/>
   ...
</department>
...

为该查询生成的 XML 还是同时包含 <employee> 元素和 <department> 元素,但这一次,<department> 元素是 <employee> 元素的父项。