FOR XML AUTO
By default:
No nesting
Use attribute-centric presentation.
Element/row tag names = schema.table or the table alias.
It's not allowed to change the row/element tag names by specifying an argument for AUTO mode.
Note it's only allowed to specify an argument to RAW or PATH mode of FOR XML to change the element/row tag name.
Example:
SELECT custid
,contactname
FROM Sales.Customers
FOR XML RAW('Customers');
By adding the ELEMENT directive, the xml result is nested and formatted using element-centric presentation.
WHEN joining multiple table:
Use ORDER BY clause to group children elements under one parent element.
The columns order in the SELECT and ORDER BY clause will influence the nesting of the XML result. I will include some examples for this on the next post.
Below are some examples.
--default presentation when no directive is specified
SELECT custid
,contactname
FROM Sales.Customers
WHERE custid <= 2
FOR XML AUTO;
Result: attribute-centric presentation, no nesting, row/element tag name = schema.table<Sales.Customers custid="1" contactname="Allen, Michael" /> <Sales.Customers custid="2" contactname="Hassall, Mark" />
--using table alias
SELECT c.custid
,c.contactname
FROM Sales.Customers AS c
WHERE c.custid <= 2
FOR XML AUTO;
Result: In this example, the row tag names = the table alias.<c custid="1" contactname="Allen, Michael" /> <c custid="2" contactname="Hassall, Mark" />
-- with ELEMENTS directive
SELECT custid
,contactname
FROM Sales.Customers
WHERE custid <= 2
FOR XML AUTO, ELEMENTS;
Result: By adding the ELEMENT directive, the XML result is nested and formatted using element-centric presentation.
<Sales.Customers> <custid>1</custid> <contactname>Allen, Michael</contactname> </Sales.Customers> <Sales.Customers> <custid>2</custid> <contactname>Hassall, Mark</contactname> </Sales.Customers>
-- with ELEMENTS and ROOT directive
SELECT custid
,contactname
FROM Sales.Customers
WHERE custid <= 2
FOR XML AUTO, ELEMENTS, ROOT('Customers');
Result: we can add the ROOT directive to make the XML result well-formed.<Customers>
<Sales.Customers>
<custid>1</custid>
<contactname>Allen, Michael</contactname>
</Sales.Customers>
<Sales.Customers>
<custid>2</custid>
<contactname>Hassall, Mark</contactname>
</Sales.Customers>
</Customers>
--changing the row/element name by specifying an argument for AUTO.
SELECT custid
,contactname
FROM Sales.Customers
WHERE custid <= 2
FOR XML AUTO('Customer'), ELEMENTS;
Result: This query fails. For AUTO mode, it's not allowed to change the row/element tag names by specifying an argument for AUTO mode. Note row/element tag name is only allowed with RAW or PATH mode of FOR XML.Next post I will provide some example output a query result to XML when joining multiple tables.
Reference:
http://technet.microsoft.com/en-us/library/ms188273.aspx
MS 70-461 Training Kit
No comments:
Post a Comment