Date post: | 04-Jan-2016 |
Category: |
Documents |
Upload: | timothy-dalton |
View: | 237 times |
Download: | 0 times |
Retrieving XML Data from SQL server
Using the FOR XML Clause to Retrieve Data
Retrieving Data in XML Format
How SQL Server Generates XML
Using the FOR XML Clause
Using RAW Mode to Retrieve XML
Using AUTO Mode to Retrieve XML
Demo: Using RAW and AUTO
Retrieving Data in XML Format
Purchase order
HTML
Retailer
Supplier
Web site
XML
XML
Customer
How SQL Server Generates XML
ROWSET
TDS/Token XML
SELECT …FROM …WHERE …FOR XML MODE
SELECT …FROM …WHERE …FOR XML MODE
Query processor
ROWSET to XML
Using the FOR XML Clause
The FOR XML Clause Syntax
XML Document Fragments
SELECT select_listFROM table_sourceWHERE search_conditionFOR XML RAW | AUTO | EXPLICIT [, XMLDATA] [, ELEMENTS] [, BINARY BASE64]
SELECT select_listFROM table_sourceWHERE search_conditionFOR XML RAW | AUTO | EXPLICIT [, XMLDATA] [, ELEMENTS] [, BINARY BASE64]
<Order OrderID="10248" OrderDate="07/04/1996"/><Order OrderID="10249" OrderDate="07/05/1996"/>
<Order OrderID="10248" OrderDate="07/04/1996"/><Order OrderID="10249" OrderDate="07/05/1996"/>
Using RAW Mode to Retrieve XML
Generic <row> element produced for each row returned by the query
SELECT OrderID, OrderDateFROM OrdersFOR XML RAW
SELECT OrderID, OrderDateFROM OrdersFOR XML RAW
<row OrderID="10248" OrderDate="07/04/1996"/><row OrderID="10249" OrderDate="07/05/1996"/>
<row OrderID="10248" OrderDate="07/04/1996"/><row OrderID="10249" OrderDate="07/05/1996"/>
Using AUTO Mode to Retrieve XML
Table name(s) are used to name elements
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO
<Orders OrderID="10248" OrderDate="07/04/1996"/><Orders OrderID="10249" OrderDate="07/05/1996"/>
<Orders OrderID="10248" OrderDate="07/04/1996"/><Orders OrderID="10249" OrderDate="07/05/1996"/>
Demonstration: Using RAW and AUTO
Controlling XML Output
Specifying the ELEMENTS Option
Working with Multiple Tables
Demo: Retrieving Data from Multiple Tables
Specifying the XMLDATA Option
Retrieving Binary Data
Specifying the ELEMENTS Option
Columns are returned as child elements
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO, ELEMENTS
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO, ELEMENTS
<Orders> <OrderID>10248</OrderID> <OrderDate>07/04/1996</OrderDate></Orders><Orders> <OrderID>10249</OrderID> <OrderDate>07/05/1996</OrderDate></Orders>
<Orders> <OrderID>10248</OrderID> <OrderDate>07/04/1996</OrderDate></Orders><Orders> <OrderID>10249</OrderID> <OrderDate>07/05/1996</OrderDate></Orders>
Working with Multiple Tables
SELECT OrderForm.OrderID, Item.ProductID Item.QuantityFROM Orders OrderForm JOIN [Order Details] ItemON OrderForm.OrderID = Item.OrderIDORDER BY OrderForm.OrderIDFOR XML RAW
SELECT OrderForm.OrderID, Item.ProductID Item.QuantityFROM Orders OrderForm JOIN [Order Details] ItemON OrderForm.OrderID = Item.OrderIDORDER BY OrderForm.OrderIDFOR XML RAW
<row OrderID="10248" ProductID="1" Quantity="12"/><row OrderID="10248" ProductID="42" Quantity="10"/>
<row OrderID="10248" ProductID="1" Quantity="12"/><row OrderID="10248" ProductID="42" Quantity="10"/>
SELECT OrderForm.OrderID, Item.ProductID Item.QuantityFROM Orders OrderForm JOIN [Order Details] ItemON OrderForm.OrderID = Item.OrderIDORDER BY OrderForm.OrderIDFOR XML AUTO
SELECT OrderForm.OrderID, Item.ProductID Item.QuantityFROM Orders OrderForm JOIN [Order Details] ItemON OrderForm.OrderID = Item.OrderIDORDER BY OrderForm.OrderIDFOR XML AUTO
<OrderForm OrderID="10248"> <Item ProductID="1" Quantity="12"/> <Item ProductID="42" Quantity="10"/></OrderForm>
<OrderForm OrderID="10248"> <Item ProductID="1" Quantity="12"/> <Item ProductID="42" Quantity="10"/></OrderForm>
Demonstration: Retrieving Data from Multiple Tables
Specifying the XMLDATA Option
XML-Data Reduced (XDR) Schema pre-pended to results
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO, XMLDATA
SELECT OrderID, OrderDateFROM OrdersFOR XML AUTO, XMLDATA
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-
com:datatypes"><ElementType name="Orders" content="empty“
model="closed"><AttributeType name="OrderID" dt:type="14"/><AttributeType name="OrderDate" dt:type="dateTime"/><attribute type="OrderID"/><attribute type="OrderDate"/></ElementType></Schema>
<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-
com:datatypes"><ElementType name="Orders" content="empty“
model="closed"><AttributeType name="OrderID" dt:type="14"/><AttributeType name="OrderDate" dt:type="dateTime"/><attribute type="OrderID"/><attribute type="OrderDate"/></ElementType></Schema>
Retrieving Binary Data
SELECT EmployeeID, PhotoFROM EmployeesWHERE EmployeeID = 10FOR XML AUTO
SELECT EmployeeID, PhotoFROM EmployeesWHERE EmployeeID = 10FOR XML AUTO
<Employees EmployeeID="1" Photo="dbObject/Employees[@EmpID='1']/@Photo"/>
<Employees EmployeeID="1" Photo="dbObject/Employees[@EmpID='1']/@Photo"/>
SELECT EmployeeID, PhotoFROM EmployeesWHERE EmployeeID = 1FOR XML AUTO, BINARY BASE64
SELECT EmployeeID, PhotoFROM EmployeesWHERE EmployeeID = 1FOR XML AUTO, BINARY BASE64
<Employees EmpID="1" Photo="FRwvAAIAAAANAA4AFAAhAP////9Ca ..."/>
<Employees EmpID="1" Photo="FRwvAAIAAAANAA4AFAAhAP////9Ca ..."/>
Generating Custom XML Formats
Custom XML Formats
Universal Tables
Using EXPLICIT Mode
Demonstration: Universal Tables and XML
Using EXPLICIT Mode with Multiple Tables
Custom XML Formats
Columns in a table that are mapped to an XML element can be represented as:
Element values
Attributes
Child elements
<Invoice InvoiceNo="10248"> <Date>1996-07-04T00:00:00</Date> <LineItem ProductID="11">Queso Cabrales</LineItem> <LineItem ProductID="42">Singaporean Fried Mee</LineItem></Invoice>
<Invoice InvoiceNo="10248"> <Date>1996-07-04T00:00:00</Date> <LineItem ProductID="11">Queso Cabrales</LineItem> <LineItem ProductID="42">Singaporean Fried Mee</LineItem></Invoice>
Universal Tables
Tabular representation of an XML document
Tag and Parent columns determine hierarchy
Column names determine element / attribute mapping
Tag Parent Invoice!1!InvoiceNo
Invoice!1!Date!Element
LineItem!2!ProductID
LineItem!2
1 NULL 10248 1996-07-04T00:00:00 NULL NULL2 1 10248 NULL 11 Queso
Cabrales2 1 10248 NULL 42 Singaporean …
Using EXPLICIT Mode
Construct the Transact-SQL to generate the universal table
Add the FOR XML EXPLICIT clause
SELECT 1 AS Tag, NULL AS Parent, OrderID AS [Invoice!1!InvoiceNo],
OrderDate AS [Invoice!1!Date!Element]FROM OrdersWHERE OrderID = 10248FOR XML EXPLICIT
SELECT 1 AS Tag, NULL AS Parent, OrderID AS [Invoice!1!InvoiceNo],
OrderDate AS [Invoice!1!Date!Element]FROM OrdersWHERE OrderID = 10248FOR XML EXPLICIT
<Invoice InvoiceNo="10248"> <Date>1996-07-04T00:00:00</Date></Invoice>
<Invoice InvoiceNo="10248"> <Date>1996-07-04T00:00:00</Date></Invoice>
Using EXPLICIT Mode with Multiple Tables
Use the UNION ALL operator to retrieve multiple Tag values
SELECT 1 AS Tag, NULL AS Parent, OrderID AS [Invoice!1!InvoiceNo], OrderDate AS [Invoice!1!Date!Element], NULL AS [LineItem!2!ProductID], NULL AS [LineItem!2]FROM OrdersWHERE OrderID=10248UNION ALLSELECT 2 AS Tag,1 AS Parent,
OD.OrderID,NULL,OD.ProductID,P.ProductName
FROM [Order Details] OD JOIN Orders O ON OD.OrderID=O.OrderIDJOIN Products P ON OD.ProductID = P.ProductIDWHERE OD.OrderID=10248ORDER BY [Invoice!1!InvoiceNo], [LineItem!2!ProductID]FOR XML EXPLICIT
SELECT 1 AS Tag, NULL AS Parent, OrderID AS [Invoice!1!InvoiceNo], OrderDate AS [Invoice!1!Date!Element], NULL AS [LineItem!2!ProductID], NULL AS [LineItem!2]FROM OrdersWHERE OrderID=10248UNION ALLSELECT 2 AS Tag,1 AS Parent,
OD.OrderID,NULL,OD.ProductID,P.ProductName
FROM [Order Details] OD JOIN Orders O ON OD.OrderID=O.OrderIDJOIN Products P ON OD.ProductID = P.ProductIDWHERE OD.OrderID=10248ORDER BY [Invoice!1!InvoiceNo], [LineItem!2!ProductID]FOR XML EXPLICIT
Demonstration: Universal Tables and XML
Best Practices
Use RAW Mode for Aggregated Data
Use AUTO Mode for Attribute-Centric or Element-Centric XML
Use Aliases with AUTO and RAW to Name XML Elements and Attributes
Use an ORDER BY Clause when Querying Multiple Tables
Use EXPLICIT Mode for XML Documents Containing a Mix of Attribute-Centric and Element-Centric Mappings