This is a follow up question to
T-Sql xml query
If I add a namespace to xml data, nothing is returned again.
DECLARE @xVar XML
SET @xVar =
'<ReportData ObjectId="123" xmlns="http://ait.com/reportdata">
<ReportId>AAAA-BBBB-CCCCC-DDDDD</ReportId>
<DocId>100</DocId>
<ReportName>Drag Scraper Troubleshooting</ReportName>
<DocType>Name</DocType>
<StatusId>1</StatusId>
<AuthorId>1</AuthorId>
</ReportData>'
SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)')
FROM @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item)
The above query returns nothing. Secondly, how would I select all elements in a single select and return a row with all elements as fields?
I want to return a record constructed as the following:
ReportId | DocId | ReportName |
AAAA-BBBB-CCCCC-DDDDD | 100 | AAAA-BBBB-CCCCC-DDDDD |
Look at WITH XMLNAMESPACES
;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata')
SELECT [ReportId]= reportdata.item.value('.', 'varchar(40)')
FROM @xVar.nodes('/ReportData/ReportId[1]') AS reportdata(item)
If my assumptions are correct and you want to list ALL ReportData elements in your XML document and want their child elements as different columns, you could look at something like this:
;WITH XMLNAMESPACES(DEFAULT 'http://ait.com/reportdata')
SELECT
[ReportId] = reportdata.item.value('(./ReportId)[1]', 'varchar(40)')
, [DocId] = reportdata.item.value('(./DocId)[1]', 'varchar(40)')
, [ReportName] = reportdata.item.value('(./ReportName)[1]', 'varchar(40)')
, [DocType] = reportdata.item.value('(./DocType)[1]', 'varchar(40)')
, [StatusId] = reportdata.item.value('(./StatusId)[1]', 'varchar(40)')
, [AuthorId] = reportdata.item.value('(./AuthorId)[1]', 'varchar(40)')
FROM @xVar.nodes('//ReportData') AS reportdata(item)
I'll need to look at cleaning up the namespace declarations a bit, but it seems to work for me...
EDIT: Amended my answer with the WITH XMLNAMESPACES clause as recommended by Martin. :)