-- prepare XML document DECLARE @XmlDoc XML = N'<bookstore specialty="novel"> <book style="autobiography"> <title>Create a Vision</title> <author> <first-name>Joe</first-name> <last-name>Smith</last-name> </author> <price>12</price> </book> <book style="textbook"> <title>XML Reference</title> <author first-name="Mary" last-name="Jane" /> <price>55</price> </book> <book style="novel" id="myfave"> <title>Paths to Success</title> <author> <first-name>Toni</first-name> <last-name>Wilson</last-name> </author> <price intl="Canada" exchange="0.7">6.50</price> </book> </bookstore>';
-- --An integer for pointing to the internal -- representation(XML Document Object Model) -- of the XML document above. DECLARE @DocHandle INT; -- Parse the XML document to XML DOM tree representation -- and returns a handle EXECUTE sys.sp_xml_preparedocument @DocHandle OUTPUT, @XmlDoc; -- Select both authors first and last name -- Note: -- The @ symbol indicates select attribute nodes. -- The | operator union the both attribute and element nodes. -- The column pattern XPath expression in the WITh clause will overwrite -- the flag(3rd parameter) of the OPENXML function. SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 1) WITH(AuthorFirstName VARCHAR(20) '@first-name | first-name' ,AuthorLastName VARCHAR(20) '@last-name | last-name'); -- Select all information for all books -- Note: since we start at /bookstore/book, -- to get to author first and last name, -- I modified the XPath expression to -- 'author/@first-name | author/first-name' SELECT * FROM OPENXML(@DocHandle, '/bookstore/book', 3) WITH(Style VARCHAR(20) '@style' ,Id VARCHAR(20) '@id' ,Title VARCHAR(30) '@title | title' ,AuthorFirstName VARCHAR(20) 'author/@first-name | author/first-name' ,AuthorLastName VARCHAR(20) 'author/@last-name | author/last-name' ,Price DECIMAL(6,2) 'price'); -- Change the columns display ordering. SELECT Title, Style, Id, AuthorFirstName, AuthorFirstName, Price FROM OPENXML(@DocHandle, '/bookstore/book', 3) WITH(Style VARCHAR(20) '@style' ,Id VARCHAR(20) '@id' ,Title VARCHAR(30) '@title | title' ,AuthorFirstName VARCHAR(20) 'author/@first-name | author/first-name' ,AuthorLastName VARCHAR(20) 'author/@last-name | author/last-name' ,Price DECIMAL(6,2) 'price'); -- Removes the internal representation -- and invalidate the document handle. EXECUTE sys.sp_xml_removedocument @DocHandle;Result for 3 queries above:
Next several posts, we'll learn how to use XQuery for querying XML.
Reference:
XPath Operators
OPENXML
OPENXML Function
OPENXML Examples
sp_xml_preparedocument
sp_xml_removedocument
XML Edge Table
XML Document Object Model(XML DOM)
No comments:
Post a Comment