将一个结果分组为基于XML格式的列的倍数

时间:2012-08-10 13:33:19

标签: sql sql-server xml tsql

我正在尝试将SQL结果集(在Stored Proc中)拆分为多个列以进行XML格式化。我的结果集包含供应商编号和产品编号,如下所示:

SupplierID    ProdCode
-----------   --------- 
Supp1         Prod1
Supp1         Prod2
Supp1         Prod3
Supp2         Prod2
Supp2         Prod3
Supp3         Prod2

我需要拆分此结果集,以便每个供应商都有自己的数据集,然后可以将其拆分为自己的XML节点,如下所示:

<SUPPLIER>
    <SUPPLIER_LINES>
        <SUPPNO>Supp1</SUPPNO>
        <PRODCODE>Prod1</WWPROD>
    </SUPPLIER_LINES>
    <SUPPLIER_LINES>
        <SUPPNO>Supp1</SUPPNO>
        <PRODCODE>Prod2</WWPROD>
    </SUPPLIER_LINES>
    <SUPPLIER_LINES>
        <SUPPNO>Supp1</SUPPNO>
        <PRODCODE>Prod3</WWPROD>
    </SUPPLIER_LINES>
</SUPPLIER>
<SUPPLIER>
    <SUPPLIER_LINES>
        <SUPPNO>Supp2</SUPPNO>
        <PRODCODE>Prod2</WWPROD>
    </SUPPLIER_LINES>
    <SUPPLIER_LINES>
        <SUPPNO>Supp2</SUPPNO>
        <PRODCODE>Prod3</WWPROD>
    </SUPPLIER_LINES>
</SUPPLIER>

我将能够找出X​​ML格式,但是在分析存储过程中的结果时遇到了麻烦:

SupplierID  ProdCode
Supp1       Prod1
Supp1       Prod2

SupplierID  ProdCode
Supp2       Prod2
Supp2       Prod3

2 个答案:

答案 0 :(得分:3)

您可以group bySupplierID节点执行SUPPLIER,并使用相关的子查询来获取SUPPLIER_LINES个节点。

select (
         select T2.SupplierID as SUPNO,
                T2.ProdCode as PRODCODE
         from YourTable as T2
         where T1.SupplierID = T2.SupplierID  
         for xml path('SUPPLIER_LINES'), type
       )
from YourTable as T1
group by SupplierID
for xml path('SUPPLIER')

您可能在表中拥有供应商,因此如果您在主查询中使用该表,则无需执行group by

答案 1 :(得分:0)

我认为您不需要在SP中生成单独的结果集(我认为这就是您所要求的)。

通过对FOR XML选项的各种调整,您应该能够在一个查询中生成此XML,但您可能需要使用EXPLICIT选项。

这应该是一个很好的起点

select 
    SupplierID as SuppNo,
    ProdCode
from 
    #t
for xml path('Supplier'), elements, type