SQL for XML Path使用节点名称和嵌套的数据值

时间:2018-08-01 14:55:48

标签: sql sql-server xml xpath

我具有以下格式的表数据:

category  productkey productcode    productname  
membership  1        055385        Professional
membership  2        055575        Student
membership  3        055370        Retired
event       4        P055391       Annual Conference
event       5        PM2018        Monthly Meeting

Im希望实现以下XML格式,请注意数据中的第二级XML节点:

 <Products>
<Membership>
    <Product>
         <productcode>055385</productcode>
         <productname>Professional<productname>
    </Product>
    <Product>
         <productcode>055575</productcode>
         <productname>Student<productname>
    </Product>
    <Product>
        <productcode>055370</productcode>
        <productname>Retired<productname>
    </Product>
</Membership>
<Event>
    <Product>
         <P055391>055385</productcode>
         <productname>Professional<productname>
    </Product>
    <Product>
         <productcode>Annual Conference</productcode>
         <productname>Monthly Meeting<productname>
    </Product>
</Event>

基于此SQL,我已经接近所需的格式:

 select CAST('<' + replace(b.category,' ','') + '>' +
                 CAST( (select productcode, 
                               productname
                         from @table a 
                         where a.productkey=b.productkey
                         for xml path ('Products'), TYPE) as varchar(max))
                  + '</' + replace(b.category,' ','') +'>' as xml)
 from @table b  
 for xml path (''), ROOT('Product') 

此SQL当前正在返回每个产品上的“类别”节点,而不是将产品分组在“类别”节点下:

 <Products>
   <Membership>
     <Product>
       <productcode>055385</productcode>
       <productname>Professional<productname>
     </Product>
  </Membership> 
  <Membership>   
     <Product>
       <productcode>055575</productcode>
       <productname>Student<productname>
     </Product>
  </Membership> 
  <Membership> 
     <Product>
       <productcode>055370</productcode>
       <productname>Retired<productname>
    </Product>
  </Membership>

任何帮助将不胜感激。 谢谢

2 个答案:

答案 0 :(得分:0)

您需要有2个嵌套的XML查询:一个用于else if (answers[x] != 'X') { score = score - 4; } 记录,一个用于membership记录。像这样:

event

答案 1 :(得分:0)

我认为这可能是您需要的:

$var

请注意, select CAST('<'+ a.Category +'>' + CAST((SELECT ProductCode, ProductName FROM Thing b WHERE b.Category = a.Category FOR XML path('Product'), type) as VARCHAR(MAX)) + '</' + a.Category + '>' AS XML) from Thing a GROUP BY a.Category ORDER BY a.Category DESC for xml path(''), root('Products') 是您的表名,您可能需要重新添加Thing语法。我只是按提供的架构和数据进行操作。