在SQL Server中生成XML

时间:2017-11-23 16:24:30

标签: sql-server xml

我有一张这样的表 -

 Version     itemid      sampleid
 --------------------------------
 1             3            23
 1             3            24
 1             4            45
 2             5            24
 2             5            23

每个版本的位置可以有多个itemid,每个itemid可以有多个sampleid

我想以下列方式为此表生成XML

<UserVersioningHistory>
  <History>
    <Version>1</Version>
    <itemid>3</itemid>
    <sampleid>23,24</sampleid>
  </History>
  <History>
    <Version>1</Version>
    <itemid>4</itemid>
    <sampleid>45</sampleid>
  </History>
  <History>
    <Version>2</Version>
    <BusinessId>5</BusinessId>
    <sampleid>24,23</sampleid>
  </History>
</UserVersioningHistory>

此处的每个节点只能有一个版本和itemid,但对于相应的itemid和Version对,可以有多个sampleid。

由于我不熟悉在SQL Server中生成XML,有人可以给我一个提示我应该使用什么方法的提示吗?

我可以使用while循环完成此任务,或者我应该编写子查询吗?

2 个答案:

答案 0 :(得分:0)

尝试一下:

select * from 
(SELECT
     version, itemid,
     STUFF(
         (SELECT ',' + sampleid
          FROM test
          WHERE version = a.version AND itemid = a.itemid
          FOR XML PATH (''))
          , 1, 1, '')  AS sampleid
FROM test AS a
GROUP BY version, itemid) as History
for xml auto, root ('UserVersioningHistory')

答案 1 :(得分:0)

除非确实需要,否则始终避免使用WHILE循环。

如果存在多个标签,则最好有SampleId部分的多个标签。 但要给你结果,你想要以下将是有效的。 (我创建了一个临时表来模仿你的情况。)

我使用FOR XML来进行XML格式化,并且必须使用第二个FOR XML来连接用逗号分隔的SampleId。 STUFF仅用于删除字符串中的第一个逗号。

{{1}}