AUTO mode generates nested elements within the XML document. Each table referenced in the select list is represented as an element in the generated XML. The order of nesting is based on the order in which tables are referenced in the select list. When you specify AUTO mode, an element is created for each table in the select list, and each column in that table is a separate attribute.
FOR XML AUTO[, ELEMENTS ]
ELEMENTS tells FOR XML AUTO to generate an XML element, instead of an attribute, for each column in the result. For example,
SELECT Employees.EmployeeID, Departments.DepartmentName FROM Employees JOIN Departments ON Employees.DepartmentID=Departments.DepartmentID ORDER BY EmployeeID FOR XML AUTO, ELEMENTS; |
In this case, each column in the result set is returned as a separate element, rather than as an attribute of the <Employees> element. If there are NULL values, the element is omitted from the generated XML document.
<Employees> <EmployeeID>102</EmployeeID> <Departments> <DepartmentName>R & D</DepartmentName> </Departments> </Employees> <Employees> <EmployeeID>105</EmployeeID> <Departments> <DepartmentName>R & D</DepartmentName> </Departments> </Employees> <Employees> <EmployeeID>129</EmployeeID> <Departments> <DepartmentName>Sales</DepartmentName> </Departments> </Employees> ... |
When you execute a query using FOR XML AUTO, data in BINARY, LONG BINARY, IMAGE, and VARBINARY columns is automatically returned in base64-encoded format. By default, NULL values are omitted from the result. You can return NULL values as empty attributes by setting the for_xml_null_treatment option to EMPTY.
For information about setting the for_xml_null_treatment option, see for_xml_null_treatment option [database].
Unless otherwise requested, the database server returns the rows of a table in an order that has no meaning. If you want the results to appear in a particular order, or for a parent element to have multiple children, you must include an ORDER BY clause in the query so that all children are adjacent. If you do not specify an ORDER BY clause, the nesting of the results depends on the plan chosen by the optimizer and you may not get the nesting you want.
FOR XML AUTO does not return a well-formed XML document because the document does not have a single root node. If a <root> element is required, one way to insert one is to use the XMLELEMENT function. For example,
SELECT XMLELEMENT( NAME root, (SELECT EmployeeID AS id, GivenName AS name FROM Employees FOR XML AUTO ) ); |
For more information about the XMLELEMENT function, see XMLELEMENT function [String].
You can change the attribute or element names used in the XML document by specifying aliases. The following query renames the ID attribute to product_ID:
SELECT ID AS product_ID FROM Products WHERE Color='Black' FOR XML AUTO; |
The following XML is generated:
<Products product_ID="302"/> <Products product_ID="400"/> <Products product_ID="501"/> <Products product_ID="700"/> |
You can also rename the table with an alias. The following query renames the table to product_info:
SELECT ID AS product_ID FROM Products AS product_info WHERE Color='Black' FOR XML AUTO; |
The following XML is generated:
<product_info product_ID="302"/> <product_info product_ID="400"/> <product_info product_ID="501"/> <product_info product_ID="700"/> |
The following query generates XML that contains both <employee> and <department> elements, and the <employee> element (the table listed first in the select list) is the parent of the <department> element.
SELECT EmployeeID, DepartmentName FROM Employees AS employee JOIN Departments AS department ON Employees.DepartmentID=Departments.DepartmentID ORDER BY EmployeeID FOR XML AUTO; |
The following XML is generated by the above query:
<employee EmployeeID="102"> <department DepartmentName="R & D"/> </employee> <employee EmployeeID="105"> <department DepartmentName="R & D"/> </employee> <employee EmployeeID="129"> <department DepartmentName="Sales;"/> </employee> <employee EmployeeID="148"> <department DepartmentName="Finance;"/> </employee> ... |
If you change the order of the columns in the select list as follows:
SELECT DepartmentName, EmployeeID FROM Employees AS employee JOIN Departments AS department ON Employees.DepartmentID=Departments.DepartmentID ORDER BY 1, 2 FOR XML AUTO; |
The result is nested as follows:
<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> ... |
Again, the XML generated for the query contains both <employee> and <department> elements, but in this case the <department> element is the parent of the <employee> element.
Send feedback about this page via email or DocCommentXchange | Copyright © 2008, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.0 |