How to get parent element name using OpenXML in sqlserver
-
07-07-2019 - |
Question
If I have some xml:
<Users>
<User>
<property1>sdfd</property1>
...
<User>
...
</Users>
And my sql is:
SELECT
*
FROM
OpenXML(@idoc, '/Users/User')
WITH (
[property1] varchar(50) 'property1',
...
)
How can I get the name of the parent element and return that in the dataset?
Solution
This page from MSDN docs on OpenXML seems to indicate you should be able to use the ".." notation for the parent:
declare @idoc int
declare @doc varchar(1000)
set @doc ='<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity')
Does that work in your case, too?
UPDATE:
Try this (the "pseudo-attribute" @mp:parentlocalname) :
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity',
ParentNodeName varchar(50) '@mp:parentlocalname' )
Does this now do what you want? :-)
See a whole list of these "pseudo-attributes" in this article at ExtremeExperts.
Marc
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow