retrieving xml data from sql server. using the for xml clause to retrieve data retrieving data in...

Post on 04-Jan-2016

257 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related