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

标签 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>


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

最佳答案

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

 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是表名,您可能需要重新添加REPLACE语法。我只是按提供的架构和数据进行操作。

关于sql - SQL for XML Path使用节点名称和嵌套的数据值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51636480/

相关文章:

sql - Oracle 优化 SQL 查询 - Multiple Max()

sql - 将 2 个月添加到当前时间戳

mysql - 通过关联查询 OR 条件

php - 随机排序会产生错误

sql-server - 表变量列中的 nvarchar(max) 与 nvarchar(n)

sql-server - 识别 SQL Server 中的连接和 Activity SQL

.net - 使用带有导入的 XSD 进行 XML 验证,并包含在 .net 核心中

sql - 如何安排作业每天运行 SQL 查询?

xml - 如何使用for xml路径查询结果防止sqlcmd截断

xml - 选择并在XSLT中附加当前节点的文本值?