FOR XML RAW
By
default:
No
root element
Attribute-centric presentation (all data is display as attributes)
All
row tag name = row
Exclude
NULL mark
Use ELEMENTS XSINIL directive to include NULL marks.
Doesn't
include nesting (XML document/fragment is format flat).
-- -- When no directive is specified after the RAW keyword, this query uses -- default setting above for the result: -- * use attribute-centric presentation(row data is stored inside row tag) -- * no nesting -- * no root node -- * all XML elements' name = row -- * NULL marks are excluded. USE TSQL2012; GO SELECT c.custid ,c.contactname FROM Sales.Customers AS c WHERE c.custid <= 2 FOR XML RAW; Result: Notice that the result is flat - no nesting. <row custid="1" contactname="Allen, Michael" /> <row custid="2" contactname="Hassall, Mark" />
-- -- This query add nesting to the result by adding the ELEMENTS directive, root node. -- Notice we change row tag name from row to Customer. SELECT c.custid ,c.contactname FROM Sales.Customers AS c WHERE c.custid <= 2 FOR XML RAW('Customer') -- Change the row tag name from row to Customer ,ELEMENTS -- Use element-centric. ,ROOT('Customers'); -- Root node with name = Customers. -- Note Root node's name cannot be an empty string. -- If ELEMENT directive is used but exclude the ROOT directive, -- the result is a XML fragment (has no root node). Result <Customers> <Customer> <custid>1</custid> <contactname>Allen, Michael</contactname> </Customer> <Customer> <custid>2</custid> <contactname>Hassall, Mark</contactname> </Customer> </Customers>
-- If we specify an empty string for the RAW mode argument, -- all rows tag name will be removed. -- Note: In this case, we also need to include ELEMENT directive, -- else error will occurs. SELECT c.custid ,c.contactname FROM Sales.Customers AS c WHERE c.custid <= 2 FOR XML RAW('') -- Remove all rows tag name ,ELEMENTS ,ROOT('Customers'); Result: <Customers> <custid>1</custid> <contactname>Allen, Michael</contactname> <custid>2</custid> <contactname>Hassall, Mark</contactname> </Customers>
-- This query will yield an error because by default XML RAW mode -- use attribute-centric presentation, and attributes are enclosed -- in the row tags. -- Therefore if the row tag are removed(by specified empty string for the RAW's argument) -- and ELEMENT directive is not specified, -- so there's no place to store the attributes. SELECT c.custid ,c.contactname FROM Sales.Customers AS c WHERE c.custid <= 2 FOR XML RAW('') -- Remove all rows tag name ,ROOT('Customers'); Result: Msg 6864, Level 16, State 1, Line 1 Row tag omission (empty row tag name) cannot be used with attribute-centric FOR XML serialization.
--This query will yield an error because root tag name -- can't be an empty string. SELECT c.custid ,c.contactname FROM Sales.Customers AS c WHERE c.custid <= 2 FOR XML RAW ,ELEMENTS ,ROOT(''); Result: Msg 6861, Level 16, State 1, Line 1 Empty root tag name cannot be specified with FOR XML.
-- This query include NULL marks and convert result to XML type. SELECT c.custid ,c.contactname ,c.fax FROM Sales.Customers AS c WHERE c.custid = 3 FOR XML RAW('Customer') -- Change the row tag name from row to Customer ,ELEMENTS XSINIL -- Indent the XML elements, use element-centric, and include NULL mark ,TYPE -- Convert to result to XML type ,ROOT('Customers'); Result: Notice customer with custid equals 3, has missing fax number. The result of missing fax is display as: <fax xsi:nil="true" /> <Customers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Customer> <custid>3</custid> <contactname>Peoples, John</contactname> <fax xsi:nil="true" /> </Customer> </Customers>
-- -- This query uses XMLDATA directive to return the XML-Data schema that -- describe the XML document structure. SELECT c.custid ,c.contactname FROM Sales.Customers AS c WHERE c.custid <= 2 FOR XML RAW ,ELEMENTS ,XMLDATA; -- return the XML-Data schema Result: <Schema name="Schema2" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="row" content="eltOnly" model="closed" order="many"> <element type="custid" /> <element type="contactname" /> </ElementType> <ElementType name="custid" content="textOnly" model="closed" dt:type="i4" /> <ElementType name="contactname" content="textOnly" model="closed" dt:type="string" /> </Schema> <row xmlns="x-schema:#Schema2"> <custid>1</custid> <contactname>Allen, Michael</contactname> </row> <row xmlns="x-schema:#Schema2"> <custid>2</custid> <contactname>Hassall, Mark</contactname> </row>
Reference:
Use RAW Mode with FOR XML: http://technet.microsoft.com/en-us/library/ms175140.aspx
70-461 Training Kit
No comments:
Post a Comment