I have an xml file that I am loading into SQL. I have no problem getting the xml file loaded and the top level nodes into a sql table. I am having difficulty reaching the next level child node.
Here is an example xml file (similar to what I am trying to get into tables):
<RSR:ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:RSR="urn:rsrNamespace" xsi:schemaLocation="urn:rsrNamespace SomeSchema.xsd">
<ClientReport>
<ClientID>05929</ClientID>
<ClientFirstName>Eric</ClientFirstName>
<ClientLastName>Jones</ClientLastName>
<ClientService>
<ClientServices>
<ServiceID>250</ServiceID>
<Salesperson>Charlie</Salesperson>
<Cost>15.95</Cost>
</ClientServices>
<ClientServices>
<ServiceID>356</ServiceID>
<Salesperson>Jane</Salesperson>
<Cost>34.25</Cost>
</ClientServices>
</ClientService>
</ClientReport>
</RSR:ROOT>
I have no problem getting the top level nodes, ClientID and ClientName, into a table. I can run this sql and get values into a temp table CLIENTREPORT:
CREATE TABLE ##XMLTable (XMLData XML)
SET @cmd = 'INSERT INTO ##XMLTable SELECT CONVERT(XML, BulkColumn) AS Bulkcolumn FROM OPENROWSET (BULK ''' + @FullPathName + ''', SINGLE_BLOB) as X'
SET @cmd = 'WITH XMLNAMESPACES (''urn:rsrNamespace'' AS p)
INSERT INTO ##CLIENTREPORT (ClientID, ClientFullName)
SELECT
CLIENTDATA.ClientReport.value(''(./ClientID)[1]'', ''VARCHAR(100)''),
CLIENTDATA.ClientReport.value(''(./ClientFirstName)[1]'', ''VARCHAR(100)'') + '' '' + CLIENTDATA.ClientReport.value(''(./ClientLastName)[1]'', ''VARCHAR(100)'')
FROM ##XMLTable X
CROSS APPLY X.XMLData.nodes(''p:ROOT/ClientReport'') AS CLIENTDATA (ClientReport)'
I am having an issue getting to those lower level nodes - ServiceID, Salesperson, Cost. Here is what I have that does not work:
SET @cmd = 'WITH XMLNAMESPACES (''urn:rsrNamespace'' AS p)
INSERT INTO ##CLIENTREPORTSERVICES (ClientID, Salesperson)
SELECT
CLIENTDATA.ClientReport.value(''(./ClientID)[1]'', ''VARCHAR(100)''),
CLIENTSERVICEDATA.ClientServices.value(''(./Salesperson)[1]'', ''VARCHAR(25)'')
FROM ##XMLTable X
CROSS APPLY X.XMLData.nodes(''p:ROOT/ClientReport'') AS CLIENTDATA (ClientReport)
CROSS APPLY CLIENTDATA.ClientReport.nodes(''ClientService/ClientServices'') AS CLIENTSERVICEDATA (ClientServices)'
All I get are null values in the Salesperson field. What am I missing about XQuery and navigating to lower level nodes?
Please try the following.
SQL
Output #1
Output #2