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 =
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 you are trying to extract data and the namespace might differ between records, you can use a wildcard for the namespace prefix. Just put "*:" before each element name in the last line of the OP's original code, like this:
FROM @xVar.nodes('/*:ReportData/*:ReportId[1]') AS reportdata(item)
Note that you need to use the wildcard at every level, not just at the same level as you see a namespace declaration in the xml. This is because namespaces are inherited by each level from the level above it.
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. :)