Come ottenere il nome dell'elemento genitore usando OpenXML in sqlserver
-
07-07-2019 - |
Domanda
Se ho qualche xml:
<Users>
<User>
<property1>sdfd</property1>
...
<User>
...
</Users>
E il mio sql è:
SELECT
*
FROM
OpenXML(@idoc, '/Users/User')
WITH (
[property1] varchar(50) 'property1',
...
)
Come posso ottenere il nome dell'elemento genitore e restituirlo nel set di dati?
Soluzione
Questa pagina da Documenti MSDN su OpenXML sembra indicare che dovresti essere in grado di utilizzare il " .. " notazione per il genitore:
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')
Funziona anche nel tuo caso?
UPDATE:
Prova questo (lo pseudo-attributo " @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' )
questo ora fa quello che vuoi? :-)
Vedi un intero elenco di questi "pseudo-attributi" in questo in ExtremeExperts .
Marc
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow