Here's the OPENXML function syntax:
OPENXML(idoc int [in], rowpattern nvarchar [in], [flags byte [in]])
[WITH (ColumnName ColumnType [ColumnPattern | MetaProperty] | TableName)]
Arguments
idoc: Document handle created by sys.sp_xml_preparedocument stored procedure
rowpattern: XPath expression to identify the nodes.
flags: Is optional. This flag indicates what type of nodes we want to retrieve from the XML document, attributes only, elements only, or both.
byte value 0 = defaults. Select attributes.
byte value 1 = select attributes. If combined with XML elements, select attributes first then elements.
byte value 2 = select elements. If combined with XML attributes, select attributes first then elements.
byte value 3 = select attributes and elements.
byte value 8 = this flag's value is used to combine with byte value 0 and 2.
Note: the column pattern in the WITH clause will override the 3rd parameters in OPENXML.
Here's a picture provides overview of the process of converting xml to table format.
Image source: Microsoft Technet.
-- step 1: -- 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 to point 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; --step 2: convert XML to grid format using OPENXML function. --when not using the WITH clause, the result is an Edge Table Format SELECT * FROM OPENXML(@DocHandle, '/bookstore');
The following examples, we will convert the authors first-names to tabular format.
-- ---------------------------------------------------- -- All these 3 queries return the same result set -- ---------------------------------------------------- -- when the 3rd parameter of OPENXML is missing, --the default mapping is used. Select the attributes only SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author') WITH("first-name" VARCHAR(20)); --3rd parameter of OPENXML = 0, --Select the attributes only SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 0) WITH("first-name" VARCHAR(20)); --3rd parameter of OPENXML = 1, select the attributes only SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 1) WITH("first-name" VARCHAR(20));
--3rd parameter of OPENXML = 2, --select the elements only SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 2) WITH("first-name" VARCHAR(20));
--3rd parameter of OPENXML = 3, --select both attributes and elements SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 3) WITH("first-name" VARCHAR(20));
-- --3rd parameter of OPENXML = 9 (this is flag value 8 + flag value 1, -- result the same as using flag value 0 or 1), select attributes only SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 9) WITH("first-name" VARCHAR(20));
-- --3rd parameter of OPENXML = 10(this is flag value 8 + flag value 2, -- result the same as using flag value 2), select elements only. SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 10) WITH("first-name" VARCHAR(20));
-- --3rd parameter of OPENXML = 11 (this is flag value 8 + flag value 3, -- result the same as using flag value 3), select both attributes and elements. SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 11) WITH("first-name" VARCHAR(20));
-- --3rd parameter of OPENXML not in (0, 1, 2, 3, 9, 10, 11), -- default is used -- select only attributes. SELECT * FROM OPENXML(@DocHandle, '/bookstore/book/author', 444) WITH("first-name" VARCHAR(20));
-- -- Final step: Removes the internal representation -- and invalidate the document handle. EXECUTE sys.sp_xml_removedocument @DocHandle;
For all queries above, the column pattern in the WITH clause is not needed because the column name(first-name) is the same as first-name attribute and first-name element in the XML document above.
That's all for now. I don't want to make this post too long. I'll provide more examples next 2 posts.
Reference:
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