T-Sql xml query with namespace

前端 未结 3 531
慢半拍i
慢半拍i 2020-12-11 03:13

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 = 
         


        
相关标签:
3条回答
  • 2020-12-11 03:38

    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) 
    
    0 讨论(0)
  • 2020-12-11 03:43

    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.

    0 讨论(0)
  • 2020-12-11 03:53

    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. :)

    0 讨论(0)
提交回复
热议问题