XML on SQL Server
-
Upload
torp42 -
Category
Technology
-
view
938 -
download
0
Transcript of XML on SQL Server
XML on SQL Server
Kristian Torp
Department of Computer ScienceAalborg University
people.cs.aau.dk/˜[email protected]
November 5, 2015
daisy.aau.dk
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 1 / 69
Outline
1 Create and Insert
2 XML QueriesSaying Helloexist()query()value()nodes()
3 Generating XML from Select StatementsRawAutoPath
4 Summary
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 2 / 69
Learning Goals
GoalsOverview of XML support on SQL Server
Storing XML directly SQL Server
Querying XML on SQL Server
StandardConcepts are (fairly) general
Code is DBMS specific
DBMS Versions TestedSQL Server 2008
SQL Server 2012
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 3 / 69
Create the Relational Schema
Example (Create the Table)create tab l e course (
i d i n t pr imary key ,dsc xml not n u l l )
NoteA create table statement as we know it
The XML data type named xml
A mixture of “old” data types int and new data types xml
The not-null constraint, just because we love them!
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 5 / 69
Insert Data
Example (Insert a Row)i n s e r t i n t o course values (1 ,’<courses><course i d =”22” ects =”5”>
<name>XML< /name><desc r i p t i on >XPath and XQuery f o r query ing XML documents</ desc r i p t i on >
</ course><course i d =”11” ects =”5”>
<name>DB< /name><desc r i p t i on >Querying a r e l a t i o n a l database < / desc r i p t i on >
</ course></ courses> ’ )
NoteA plain insert statement
The XML data type coersed from the text string
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 6 / 69
Insert Additional Row
Example (Insert another Row)i n s e r t i n t o course values (2 ,’<courses><course i d =”44” ects =”10”>
<name> Impera t i ve Programming< /name><desc r i p t i on >C and Pointers < / desc r i p t i on >
</ course><course i d =”55” ects =”5”>
<name>OOP< /name><desc r i p t i on >Working wi th c lasses and objec ts < / desc r i p t i on >
</ course></ courses> ’ )
NoteNothing new conceptually, simply an insert statement
We now have a small database!
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 7 / 69
Database ContentExample
id dsc
1
<courses><course i d = ” 22 ” ects= ” 5 ”>
<name>XML< / name><d e s c r i p t i o n>XPath . . .< / d e s c r i p t i o n>
< / course><course i d = ” 11 ” ects= ” 5 ”>
<name>DB< / name><d e s c r i p t i o n>Querying . . .< / d e s c r i p t i o n>
< / course>< / courses>
2
<courses><course i d = ” 44 ” ects= ” 10 ”>
<name> Impera t i ve Programming< / name><d e s c r i p t i o n>C . . .< / d e s c r i p t i o n>
< / course><course i d = ” 55 ” ects= ” 5 ”>
<name>OOP< / name><d e s c r i p t i o n>Working . . .< / d e s c r i p t i o n>
< / course>< / courses>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 8 / 69
Not Well-formed XML
Example (Insert a Row)i n s e r t i n t o course values (3 ,’<course i d =”77” ects =”10”><name>Object−Oriented Ana lys is and Design < /name><desc r i p t i on >Modeling wi th c lasses and objec ts < / desc r i p t i on >
</ course><course i d =”88” ects =”5”>
<name>Software Arch i t ec tu re < /name><desc r i p t i on >The big p i c tu re < / desc r i p t i on >
</ course> ’ )
NoteHas no root element
This works fine!
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 9 / 69
Not Well-formed XML, cont.
Example (End tag is missing)i n s e r t i n t o course values (4 ,’<course i d =”99” ects =”10”><name>Operat ing Systems< /name><desc r i p t i on >Linux , Windows , and so on< / desc r i p t i on > ’ )
NoteXML parsing: line 3, character 61, unexpected end of input
Example (Fix the missing end tag)i n s e r t i n t o course values (4 ,’<course i d =”99” ects =”10”><name>Operat ing Systems< /name><desc r i p t i on >Linux , Windows , and so on< / desc r i p t i on >
</ course> ’ )
NoteWorks!
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 10 / 69
Not Well-formed XML, cont.
Example (Nesting Wrong)i n s e r t i n t o course values (5 ,’<course i d =”13” ects =”5”><name><more>Compiler Const ruct ion < /name></more><desc r i p t i on >Lex and Yacc< / desc r i p t i on >
</ course> ’ )
NoteXML parsing: line 2, character 41, end tag does not match start tag
Example (“Weird” Cases)i n s e r t i n t o course values (6 , ’ ’ )i n s e r t i n t o course values (7 , ’NULL ’ )
NoteWorks!
Example (Does this work?)i n s e r t i n t o course values (8 ,NULL)
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 11 / 69
Summary: Create and Insert
Main PointsCreate table has new XML data type
Very similar to the SQL/XML XML data type
Insert statement works as expected
XML documents, without root possible, tags must be matchingDelete works as expected
Not shown here
There is special support for updating XML columnsUpdating only a part of the XML document in a cell
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 12 / 69
Recall the Database ContentExample
id dsc
1
<courses><course i d = ” 22 ” ects= ” 5 ”>
<name>XML< / name><d e s c r i p t i o n>XPath . . .< / d e s c r i p t i o n>
< / course><course i d = ” 11 ” ects= ” 5 ”>
<name>DB< / name><d e s c r i p t i o n>Querying . . .< / d e s c r i p t i o n>
< / course>< / courses>
2
<courses><course i d = ” 44 ” ects= ” 10 ”>
<name> Impera t i ve Programming< / name><d e s c r i p t i o n>C . . .< / d e s c r i p t i o n>
< / course><course i d = ” 55 ” ects= ” 5 ”>
<name>OOP< / name><d e s c r i p t i o n>Working . . .< / d e s c r i p t i o n>
< / course>< / courses>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 15 / 69
Say Hello
Example (Use the Course Table)s e l e c t dsc . query ( ” l e t $s := ’ Hel lo , World ! ’ r e t u r n $s ” )from course
NoteThis does not work!
And I used a long time to understand why not :-)
Example (Try Again (almost the same))s e l e c t dsc . query ( ’ l e t $s := ” Hel lo , World ! ” r e t u r n $s ’ )from course
NoteWorks!
’ and “ are different!
dsc is a column on table course
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 16 / 69
Say Hello, cont
Example (Say Hello from XQuery)s e l e c t dsc . query ( ’ l e t $s := ” Hel lo , World ! ” r e t u r n $s ’ )from course
Example (Result)
(No column name)
Hello, World!Hello, World!
NoteA hello for each row in the table
This is a simple XQuery
SQL Server generally follows the XQuery standard well
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 17 / 69
Say Hello, the T-SQL Way
Example (Use a Variable)dec lare @x xmls e l e c t @x. query ( ’ l e t $s := ” Hel lo , World ! ” r e t u r n $s ’ )
Example (Result)
(No column name)
null
Example (Initialize the Variable)dec lare @x xml = ’ ’s e l e c t @x. query ( ’ l e t $s := ” Hel lo , World ! ” r e t u r n $s ’ )
Example (Result)
(No column name)
Hello, World!
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 18 / 69
Document IDs with more than 5 ECTS Courses
Example (Use exist() in where )s e l e c t i dfrom coursewhere dsc . e x i s t ( ’ / / course [ @ects > 5] ’ )
NoteAn expression of non-boolean type specified in a context where acondition is expected, near ’)’
Example (Use exist() in select )s e l e c t id , dsc . e x i s t ( ’ / / course [ @ects > 5] ’ )from course
Example (Result)
id (No column name)
1 02 1
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 20 / 69
Retrying Document IDs with more than 5 ECTS Courses
Example (Use exist() in where )s e l e c t i dfrom coursewhere dsc . e x i s t ( ’ / / course [ @ects > 5] ’ ) = 1
Example (Result)
id
2
Noteexist() returns 0, 1 or null
This is a surprise! (when used to other DBMSs)
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 21 / 69
Recall the Database ContentExample
id dsc
1
<courses><course i d = ” 22 ” ects= ” 5 ”>
<name>XML< / name><d e s c r i p t i o n>XPath . . .< / d e s c r i p t i o n>
< / course><course i d = ” 11 ” ects= ” 5 ”>
<name>DB< / name><d e s c r i p t i o n>Querying . . .< / d e s c r i p t i o n>
< / course>< / courses>
2
<courses><course i d = ” 44 ” ects= ” 10 ”>
<name> Impera t i ve Programming< / name><d e s c r i p t i o n>C . . .< / d e s c r i p t i o n>
< / course><course i d = ” 55 ” ects= ” 5 ”>
<name>OOP< / name><d e s c r i p t i o n>Working . . .< / d e s c r i p t i o n>
< / course>< / courses>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 23 / 69
XPath for finding Course Names
Example (Use XPath)s e l e c t dsc . query ( ’ / courses / course / name ’ ) as resfrom course
Example (Result)
res<name>XML< / name><name>DB< / name><name> Impera t i ve Programming< / name><name>OOP< / name>
null
NoteWhat was expected, it is really XPath!
A null value for each row where the XPath has no match
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 24 / 69
XPath for finding Course Names in Text Format
Example (Use text())s e l e c t dsc . query ( ’ / courses / course / name / t e x t ( ) ’ ) as resfrom course
Example (Result)
res
XMLDBImperative ProgrammingOOP
NoteWhat was expected!
Not really useful in an SQL context
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 25 / 69
Accessing Attributes
Example (Look at Attributes)s e l e c t dsc . query ( ’ / courses / course / @ects ’ ) as resfrom course
NoteXQuery [course.dsc.query()]: Attribute may not appear outside of anelement
Unexpected!
Example (Look at Attributes)s e l e c t dsc . query ( ’sum ( / courses / course / @ects ) ’ ) as resfrom course
Example (Result)
res
1015
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 26 / 69
More XPath
Example (Find 5 ECTS Courses)s e l e c t dsc . query ( ’ / courses / course [ @ects = 5 ] /name / t e x t ( ) ’ ) as resfrom course
Example (Result)
res
XMLDBOOP
Example (Filtering using where )s e l e c t dsc . query ( ’ / / course / name / t e x t ( ) ’ ) as resfrom coursewhere i d = 1
Example (Result)
res
XMLDB
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 27 / 69
Multi-Column XPath
Example (More than One Column)s e l e c t dsc . query ( ’ / / course / name ’ ) as name,
dsc . query ( ’ / / course / d e s c r i p t i o n ’ ) as descrfrom course
Example (Result)
name descr<name>XML< / name><name>DB< / name>
<d e s c r i p t i o n>XPath . . .< / d e s c r i p t i o n><d e s c r i p t i o n>Querying . . .< / d e s c r i p t i o n>
<name> Impera t i ve . . .< / name><name>OOP< / name>
<d e s c r i p t i o n>C and Po in te rs< / d e s c r i p t i o n><d e s c r i p t i o n>Working . . .< / d e s c r i p t i o n>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 28 / 69
Multi-Column XPath with text()
Example (Multiple Columns and text())s e l e c t dsc . query ( ’ / / course / name / t e x t ( ) ’ ) as name,
dsc . query ( ’ / / course / d e s c r i p t i o n / t e x t ( ) ’ ) as descrfrom course
Example (Result)
name descr
XMLDB XPath ... Querying ...Imperative Programming OOP C and Pointers Working ...
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 29 / 69
Full FLWOR
Example (FLWOR Query)s e l e c t dsc . query ( ’ f o r $c i n / / course
where $c / @ects >= 5r e t u r n ( $c / name, $c / d e s c r i p t i o n ) ’ ) as res
from course
Example (Result)
res<name>XML< / name><d e s c r i p t i o n>XPath and XQuery f o r query ing XML documents< / d e s c r i p t i o n><name>DB< / name><d e s c r i p t i o n>Querying a r e l a t i o n a l database< / d e s c r i p t i o n><name> Impera t i ve Programming< / name><d e s c r i p t i o n>C and Po in te rs< / d e s c r i p t i o n><name>OOP< / name><d e s c r i p t i o n>Working wi th c lasses and ob jec ts< / d e s c r i p t i o n>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 30 / 69
Recall the Database ContentExample
id dsc
1
<courses><course i d = ” 22 ” ects= ” 5 ”>
<name>XML< / name><d e s c r i p t i o n>XPath . . .< / d e s c r i p t i o n>
< / course><course i d = ” 11 ” ects= ” 5 ”>
<name>DB< / name><d e s c r i p t i o n>Querying . . .< / d e s c r i p t i o n>
< / course>< / courses>
2
<courses><course i d = ” 44 ” ects= ” 10 ”>
<name> Impera t i ve Programming< / name><d e s c r i p t i o n>C . . .< / d e s c r i p t i o n>
< / course><course i d = ” 55 ” ects= ” 5 ”>
<name>OOP< / name><d e s c r i p t i o n>Working . . .< / d e s c r i p t i o n>
< / course>< / courses>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 32 / 69
Get Course Names in a Relational Fashion
Example (Using the value() Function)s e l e c t dsc . value ( ’ / / course / name ’ , ’ nvarchar (30) ’ )from course
NoteXQuery [course.dsc.value()]: ’value()’ requires a singleton (or emptysequence), found operand of type ’xdt:untypedAtomic *’
Example (Singleton’ing)s e l e c t dsc . value ( ’ ( / / course / name ) [ 1 ] ’ , ’ nvarchar (30) ’ )from course
Example (Result)
(No column name)
XMLImperative Programming
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 33 / 69
Retrying Get Course Names in a Relational FashionExample (First)s e l e c t dsc . value ( ’ ( / / course [ 1 ] / name ) [ 1 ] ’ , ’ nvarchar (30) ’ )from course
Example (Result)
(No column name)
XMLImperative Programming
Example (Last)s e l e c t dsc . value ( ’ ( / / course / name ) [ l a s t ( ) ] ’ , ’ nvarchar (30) ’ )from course
Example (Result)
(No column name)
DBOOP
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 34 / 69
Value and Wrong SQL Data TypeExample (First)s e l e c t dsc . value ( ’ ( / / course / name ) [ 1 ] ’ , ’ nvarchar (30) ’ )from course
Example (Result)
(No column name)
XMLImperative Programming
Example (Last)s e l e c t dsc . value ( ’ ( / / course / name ) [ 1 ] ’ , ’ nvarchar ( 3 ) ’ )from course
Example (Result)
(No column name)
XMLImp
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 35 / 69
value() and Wrong SQL Data Type, cont.
Example (String as an Integer)s e l e c t dsc . value ( ’ ( / / course / name ) [ 1 ] ’ , ’ i n t ’ )from course
NoteConversion failed when converting the nvarchar value ’XML’ to datatype int.
Example (Integer Attribute)s e l e c t dsc . value ( ’ ( / / course / @ects ) [ 1 ] ’ , ’ i n t ’ )from course
Example (Result)
(No column name)
510
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 36 / 69
Flattening using value()
Example (String as an Integer)s e l e c t id ,
dsc . value ( ’ ( / / course / @ects ) [ 1 ] ’ , ’ i n t ’ ) as ectsfrom coursewhere dsc . e x i s t ( ’ / / course [ @ects > 5] ’ ) = 1
Example (Result)
id ects
2 10
NoteUsing value() and exist() functions in same query
Still too few rows
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 37 / 69
Flattening using value(), cont
Example (String as an Integer)s e l e c t dsc . value ( ’ ( / / course / @id ) [ l a s t ( ) ] ’ , ’ i n t ’ ) as cid ,
dsc . value ( ’ ( / / course / name ) [ l a s t ( ) ] ’ , ’ nvarchar (30) ’ ) as cname ,dsc . value ( ’ ( / / course / d e s c r i p t i o n ) [ l a s t ( ) ] ’ , ’ nvarchar (50) ’ ) as dsc ,dsc . value ( ’ ( / / course / @ects ) [ l a s t ( ) ] ’ , ’ i n t ’ ) as ects
from course
Example (Result)
cid cname dsc ects
11 DB Querying... 555 OOP Working... 5
NotePure relational world result
Result only has two rows (should have four)
value() cannot be used must use nodes()
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 38 / 69
Flattening using nodes()Example (Flatten XML)s e l e c t f l a t . course . value ( ’ ( . / @id ) [ 1 ] ’ , ’ i n t ’ ) as cid ,
f l a t . course . value ( ’ ( . / name ) [ 1 ] ’ , ’ varchar (50) ’ ) as cname ,f l a t . course . value ( ’ ( . / d e s c r i p t i o n ) [ 1 ] ’ , ’ varchar (50) ’ ) as dsc ,f l a t . course . value ( ’ ( . / @ects ) [ 1 ] ’ , ’ i n t ’ ) as ects
from coursecross apply dsc . nodes ( ’ / / course ’ ) f l a t ( course )
order by c id
Example (Result)
cid cname dsc ects
11 DB Querying... 522 XML XPath... 544 Imp. C and ... 1055 OOP Working... 5
NoteRelational view on XML data!!!
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 40 / 69
Hide XMLExample (Create a View on XML Data)create view c o u r s e x m l f l a t ass e l e c t f l a t . course . value ( ’ ( . / @id ) [ 1 ] ’ , ’ i n t ’ ) as cid ,
f l a t . course . value ( ’ ( . / name ) [ 1 ] ’ , ’ varchar (50) ’ ) as cname ,f l a t . course . value ( ’ ( . / d e s c r i p t i o n ) [ 1 ] ’ , ’ varchar (50) ’ ) as dsc ,f l a t . course . value ( ’ ( . / @ects ) [ 1 ] ’ , ’ i n t ’ ) as ects
from coursecross apply dsc . nodes ( ’ / / course ’ ) f l a t ( course )
Example (Query the View)s e l e c t ∗from c o u r s e x m l f l a twhere ects = 5 and c id > 20order by c id
Example (Result)
cid cname dsc ects
22 XML XPath... 555 OOP Working... 5
NoteRelational view on XML data!!!
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 41 / 69
Summary: Queries
Functions
Function Descrition
exist() Check for existencequery() XPath and XQueryvalue() Extract single valuenodes() For flatting nodesmodify() For (fine grained) updates of XML
NoteSQL Server only
SQL/XML via programming languages
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 42 / 69
Master-Detail Example I
Order
id
customer name
amount
OrderLine
lineno
price per unit
quan. desc.
has
AssumptionsAn order cannot exist without order linesAmount is the sum of the amount of order lines for a give order
Must be larger than zero
Derived from order lines but stored because often queried
Order line is a weak entity
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 44 / 69
Master-Detail Example II
Examplecreate tab l e oorder (
o id i n t pr imary key ,cname varchar (30) not n u l l )
Examplecreate tab l e o o r d e r l i n e (
o id i n t not n u l l ,l i n e n o i n t not n u l l check ( l i n e n o > 0) ,dsc varchar (50) not n u l l ,q u a n t i t y i n t not n u l l check ( q u a n t i t y > 0) ,p r ice each numeric (6 ,2 ) not n u l l check ( pr ice each > 0 . 0 ) ,c o n s t r a i n t o l pk pr imary key ( oid , l i n e n o ) ,c o n s t r a i n t o l o f k f o r e i g n key ( o id )
re ferences oorder ( o id ) )
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 45 / 69
Get XML Out
Examples e l e c t ∗from oorderf o r xml raw
Example (Result)<row oid= ” 11 ” cname= ” Anna ” /><row oid= ” 22 ” cname= ” Benny ” /><row oid= ” 33 ” cname= ” Curt ” />
NoteA select statement
The for xml raw is SQL Server specific
Pretty ugly format ;-)
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 47 / 69
Get Elements Out
Examples e l e c t ∗from oorderf o r xml raw , elements
Example (Result)<row><o id>11< / o id><cname>Anna< / cname>
< / row><row><o id>22< / o id><cname>Benny< / cname>
< / row><row><o id>33< / o id><cname>Curt< / cname>
< / row>
NoteMuch nicer
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 48 / 69
Rename Element Names
Examples e l e c t o id as ” order− i d ” ,
cname as ” customer−name”from oorderf o r xml raw , elements
Example (Result)<row><order− i d>11< / order− i d><customer−name>Anna< / customer−name>
< / row><row><order− i d>22< / order− i d><customer−name>Benny< / customer−name>
< / row>sn ip
NoteA select statement
The for xml raw is SQL Server specific
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 49 / 69
Rename Enclosed Element
Examples e l e c t o id as ” order− i d ” ,
cname as ” customer−name”from oorderf o r xml raw ( ’ customer ’ ) , elements
Example (Result)<customer><order− i d>11< / order− i d><customer−name>Anna< / customer−name>
< / customer><customer><order− i d>33< / order− i d><customer−name>Curt< / customer−name>
< / customer>
NoteAll columns are elements
Missing a root element
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 50 / 69
Adding a Root Element
Examples e l e c t o id as ” order− i d ” ,
cname as ” customer−name”from oorderf o r xml raw ( ’ customer ’ ) , elements , roo t ( ’ customers ’ )
Example (Result)<customers><customer><order− i d>11< / order− i d><customer−name>Anna< / customer−name>
< / customer><customer><order− i d>33< / order− i d><customer−name>Curt< / customer−name>
< / customer>< / customers>
NoteNow nice XML document
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 51 / 69
Joining Tables
Examples e l e c t ∗from oorder , o o r d e r l i n ewhere oorder . o id = o o r d e r l i n e . o idf o r xml raw , elements
Example (Result (snip))<row><o id>11< / o id><cname>Anna< / cname><o id>11< / o id>< l i n e n o>1< / l i n e n o><dsc>Cola< / dsc><q u a n t i t y>1< / q u a n t i t y><pr ice each>10.00< / p r ice each>
< / row>
NoteNo nesting
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 52 / 69
Summary: Raw
OverviewFast to get XML fragments out
Nice simple extension to select statement
Default output in attributesEither all attributes or all elements
Mixture of attributes and elements hard
Is a bit “raw”
Additional options, type, xmldata, xmlschema
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 53 / 69
Get XML Out
Examples e l e c t ∗from oorderf o r xml auto
Example (Result)<row oid= ” 11 ” cname= ” Anna ” /><row oid= ” 22 ” cname= ” Benny ” /><row oid= ” 33 ” cname= ” Curt ” />
NoteAt first glanse looks like for xml raw
But wait, there is more ...
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 55 / 69
The Power of Auto
Examples e l e c t ∗from oorder , o o r d e r l i n ewhere oorder . o id = o o r d e r l i n e . o idand o id < 30f o r xml auto
Example (Result)<oorder o id= ” 11 ” cname= ” Anna ”><o o r d e r l i n e o id= ” 11 ” l i n e n o = ” 1 ” dsc= ” Cola ” q u a n t i t y = ” 1 ” pr ice each= ” 10.00 ” /><o o r d e r l i n e o id= ” 11 ” l i n e n o = ” 2 ” dsc= ” Chips ” q u a n t i t y = ” 1 ” pr ice each= ” 15.00 ” />
< / oorder><oorder o id= ” 22 ” cname= ” Benny ”><o o r d e r l i n e o id= ” 22 ” l i n e n o = ” 1 ” dsc= ” Cola ” q u a n t i t y = ” 1 ” pr ice each= ” 10.00 ” /><o o r d e r l i n e o id= ” 22 ” l i n e n o = ” 2 ” dsc= ” Burger ” q u a n t i t y = ” 2 ” pr ice each= ” 20.00 ” /><o o r d e r l i n e o id= ” 22 ” l i n e n o = ” 3 ” dsc= ” Chips ” q u a n t i t y = ” 1 ” pr ice each= ” 15.00 ” />
< / oorder>
NoteDoes automatic nesting at “natural” levels
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 56 / 69
Rename Elements
Examples e l e c t oorder . o id as ” order ” ,
oorder . cname as ” customer ” ,o o r d e r l i n e . dsc as ” d e s c r i p t i o n ” ,o o r d e r l i n e . quan t i t y ,o o r d e r l i n e . pr ice each as ” p r i ce ”
from oorder , o o r d e r l i n ewhere oorder . o id = o o r d e r l i n e . o idf o r xml auto
Example (Result (snip))<oorder order= ” 11 ” customer= ” Anna ”><o o r d e r l i n e d e s c r i p t i o n = ” Cola ” q u a n t i t y = ” 1 ” p r i ce = ” 10.00 ” /><o o r d e r l i n e d e s c r i p t i o n = ” Chips ” q u a n t i t y = ” 1 ” p r i ce = ” 15.00 ” />
< / oorder><oorder order= ” 22 ” customer= ” Benny ”><o o r d e r l i n e d e s c r i p t i o n = ” Cola ” q u a n t i t y = ” 1 ” p r i ce = ” 10.00 ” /><o o r d e r l i n e d e s c r i p t i o n = ” Burger ” q u a n t i t y = ” 2 ” p r i ce = ” 20.00 ” /><o o r d e r l i n e d e s c r i p t i o n = ” Chips ” q u a n t i t y = ” 1 ” p r i ce = ” 15.00 ” />
< / oorder>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 57 / 69
Add Root Element + RenameExamples e l e c t ” order ” . o id as ” i d ” ,
” order ” . cname as ” customer ” ,” l i n e ” . dsc as ” d e s c r i p t i o n ” ,” l i n e ” . quan t i t y ,” l i n e ” . p r ice each as ” p r i ce ”
from oorder as ” order ” , o o r d e r l i n e as ” l i n e ”where ” order ” . o id = ” l i n e ” . o idf o r xml auto , roo t ( ’ orders ’ )
Example (Result (snip))<orders><order i d = ” 11 ” customer= ” Anna ”>< l i n e d e s c r i p t i o n = ” Cola ” q u a n t i t y = ” 1 ” p r i ce = ” 10.00 ” />< l i n e d e s c r i p t i o n = ” Chips ” q u a n t i t y = ” 1 ” p r i ce = ” 15.00 ” />
< / order><order i d = ” 22 ” customer= ” Benny ”>< l i n e d e s c r i p t i o n = ” Cola ” q u a n t i t y = ” 1 ” p r i ce = ” 10.00 ” />< l i n e d e s c r i p t i o n = ” Burger ” q u a n t i t y = ” 2 ” p r i ce = ” 20.00 ” />< l i n e d e s c r i p t i o n = ” Chips ” q u a n t i t y = ” 1 ” p r i ce = ” 15.00 ” />
< / order>< / orders>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 58 / 69
Make it All Elements
Examples e l e c t ” order ” . o id as ” i d ” ,
” order ” . cname as ” customer ” ,” l i n e ” . dsc as ” d e s c r i p t i o n ” ,” l i n e ” . quan t i t y ,” l i n e ” . p r ice each as ” p r i ce ”
from oorder as ” order ” , o o r d e r l i n e as ” l i n e ”where ” order ” . o id = ” l i n e ” . o idf o r xml auto , elements , roo t ( ’ orders ’ )
Example (Result (snip))<orders><order>< i d>11< / i d><customer>Anna< / customer>< l i n e><d e s c r i p t i o n>Cola< / d e s c r i p t i o n><q u a n t i t y>1< / q u a n t i t y><p r i ce>10.00< / p r i c e>
< / l i n e>sn ip
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 59 / 69
Summary: Auto
OverviewFast to get XML out even for joins
Row tag can only be renamed by table alias
Okay at getting nesting correct
Either attributes or elements
Options similar as for the xml raw output
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 60 / 69
Get XML Out
Examples e l e c t oorder . o id as ” i d ” ,
oorder . cname as ” customer ” ,o o r d e r l i n e . l i n e n o as ” l i neno ” ,o o r d e r l i n e . dsc as ” d e s c r i p t i o n ” ,o o r d e r l i n e . quan t i t y ,o o r d e r l i n e . pr ice each as ” p r i ce ”
from oorder , o o r d e r l i n ewhere oorder . o id = o o r d e r l i n e . o idf o r xml path
Example (Result (snip))<row>< i d>11< / i d><customer>Anna< / customer>< l i neno>1< / l i neno><d e s c r i p t i o n>Cola< / d e s c r i p t i o n><q u a n t i t y>1< / q u a n t i t y><p r i ce>10.00< / p r i c e>
< / row>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 62 / 69
Adding StructureExamples e l e c t oorder . o id as ” i d ” ,
oorder . cname as ” customer ” ,o o r d e r l i n e . l i n e n o as ” l i neno ” ,o o r d e r l i n e . dsc as ” d e s c r i p t i o n ” ,o o r d e r l i n e . quan t i t y ,o o r d e r l i n e . pr ice each as ” p r i ce ”
from oorder , o o r d e r l i n ewhere oorder . o id = o o r d e r l i n e . o idf o r xml path ( ’ order ’ ) , r oo t ( ’ orders ’ )
Example (Result (snip))<orders><order>< i d>11< / i d><customer>Anna< / customer>< l i neno>1< / l i neno><d e s c r i p t i o n>Cola< / d e s c r i p t i o n><q u a n t i t y>1< / q u a n t i t y><p r i ce>10.00< / p r i c e>
< / order><order>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 63 / 69
Adding Attributes and Nesting Line ItemsExamples e l e c t oorder . o id as ”@id ” ,
oorder . cname as ” customer ” ,o o r d e r l i n e . l i n e n o as ” l i n e / l i neno ” ,o o r d e r l i n e . dsc as ” l i n e / d e s c r i p t i o n ” ,o o r d e r l i n e . q u a n t i t y as ” l i n e / q u a n t i t y ” ,o o r d e r l i n e . pr ice each as ” l i n e / p r i ce ”
from oorder , o o r d e r l i n ewhere oorder . o id = o o r d e r l i n e . o idf o r xml path ( ’ order ’ ) , r oo t ( ’ orders ’ )
Example (Result (snip))<orders><order i d = ” 11 ”><customer>Anna< / customer>< l i n e>< l i neno>1< / l i neno><d e s c r i p t i o n>Cola< / d e s c r i p t i o n><q u a n t i t y>1< / q u a n t i t y><p r i ce>10.00< / p r i c e>
< / l i n e>< / order>
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 64 / 69
Nesting CorrectlyExamples e l e c t oorder . o id as ”@id ” ,
oorder . cname as ” customer ” ,( s e l e c t o o r d e r l i n e . l i n e n o as ” @lineno ” ,
o o r d e r l i n e . dsc as ” d e s c r i p t i o n ” ,o o r d e r l i n e . q u a n t i t y as ” q u a n t i t y ” ,o o r d e r l i n e . pr ice each as ” p r i ce ”
from o o r d e r l i n ewhere oorder . o id = o o r d e r l i n e . o idf o r xml path ( ’ l i n e ’ ) , type )
from oorderf o r xml path ( ’ order ’ ) , r oo t ( ’ orders ’ )
Example (Result (snip))<orders><order i d = ” 11 ”><customer>Anna< / customer>< l i n e l i neno = ” 1 ”><d e s c r i p t i o n>Cola< / d e s c r i p t i o n><q u a n t i t y>1< / q u a n t i t y><p r i ce>10.00< / p r i c e>
< / l i n e>Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 65 / 69
Summary: Auto
OverviewMore complicated than raw and auto modeNesting “correctly” by subqueries
Cast to XML type otherwise a string!
Relies on naming conventions for attributes versus elements
Options similar as for the raw and auto modes
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 66 / 69
Summary
SummaryXPath follows the standard
XQuery follows the standard
XML support on SQL Server far from standard!
Not Looked At (RTFM :-))Indexing XML columns
Updates
Querying XML from C#
SQLXML (Microsoft specific)
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 68 / 69
Additional Information
Web SitesIntroduction to XQuery in SQL Server 2005
Good overview, cannot find a newermsdn.microsoft.com/en-us/library/ms345122(v=sql.90).aspx
XML Options in Microsoft SQL Server 2005More on the XML data type, cannot find a newermsdn.microsoft.com/en-us/library/ms345110%28v=sql.90%29.
aspx
SQLXML 4.0 Programming ConceptsGood tutorialMust be installed separately on SQL Server 2008 and abovemsdn.microsoft.com/en-us/library/ms171779.aspx
FOR XML (SQL Server)SQL Server 2012http://msdn.microsoft.com/en-us/library/ms178107.aspx
Kristian Torp (Aalborg University) XML on SQL Server November 5, 2015 69 / 69