2015-03-25 121 views
0

我有SQL Server表中的数据,如下所示。对于XML路径 - SQL Server

**Name  Date  AA BB CC** 
Customer1 3-Mar-15 234 56 4567 
Customer2 4-Mar-15 55 66 77 

现在我希望这些数据在XML中被格式化如下。

<ReturnsList> 
    <Return Label='AA' Days = 1 value = '234'></Return> 
    <Return Label='BB' Days = 2 value = '56'></Return> 
    <Return Label='CC' Days = 3 value = '4567'></Return> 
</ReturnsList> 
<ReturnsList> 
    <Return Label='AA' Days = 1 value = '55'></Return> 
    <Return Label='BB' Days = 2 value = '66'></Return> 
    <Return Label='CC' Days = 3 value = '77'></Return> 
</ReturnsList> 

我试图像不同的方式:

SELECT 

(Select AA AS "AA", 

    BB AS "BB", 

    CC AS "CC" 

from table 
for xml path('Return') ,type 
) 
FOR XML PATH ('ReturnsList'); 

我没有得到XML格式的预期。

任何人都可以请帮忙吗?

谢谢, 米塔尔。

+0

我已经例如上面更新,因为它应该对所有行工作。我如何通过下面的CTE查询来实现这一点? – 2015-03-25 12:15:56

回答

1

FOR XML PATH对行集合进行操作。因此,您必须将单行数据转换为一组行。您可以使用UNPIVOT此:

SELECT Name, Labels, LabelValue, 
     CASE 
      WHEN Labels = 'AA' THEN 1 
      WHEN Labels = 'BB' THEN 2 
      WHEN Labels = 'CC' THEN 3 
     END AS [Days] 
FROM 
    (SELECT Name, AA, BB, CC 
    FROM #mytable) p 
UNPIVOT (
    LabelValue FOR Labels IN ([AA], [BB], [CC]) 
)AS unpvt 

输出:

Name  Labels LabelValue Days 
    -------------------------------------- 
    Customer1 AA  234   1 
    Customer1 BB  56   2 
    Customer1 CC  4567  3 

你现在可以在一个CTE包裹上面的查询和应用FOR XML PATH以获得期望的结果:

;WITH CTE AS (
    ... above query here ... 
) 
SELECT Labels AS "@Label", [Days] AS "@Days", LabelValue AS "@value" 
FROM CTE 
FOR XML PATH('Return'), root('ReturnsList') 

对于多个日期,客户可以通过适当的使用来调整上述查询条款。

+0

谢谢你的详细解答。我可以在select语句中使用这个CTE查询吗?因为我想将这个xml输出插入到另一个包含#mytable其他列的表中。这可能吗? – 2015-03-25 12:00:17

0
select 'AA' as [Return/@Label], 
     1 as [Return/@Days] , 
     T.AA as [Return/@Value], 
     null, 
     'BB' as [Return/@Label], 
     2 as [Return/@Days] , 
     T.BB as [Return/@Value], 
     null, 
     'CC' as [Return/@Label], 
     3 as [Return/@Days] , 
     T.CC as [Return/@Value], 
     null 
from table as T 
for xml path('ReturnList'); 

结果:

<ReturnList> 
    <Return Label="AA" Days="1" Value="234" /> 
    <Return Label="BB" Days="2" Value="56" /> 
    <Return Label="CC" Days="3" Value="4567" /> 
</ReturnList> 
<ReturnList> 
    <Return Label="AA" Days="1" Value="55" /> 
    <Return Label="BB" Days="2" Value="66" /> 
    <Return Label="CC" Days="3" Value="77" /> 
</ReturnList>