我有一张这样的表 -
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循环完成此任务,或者我应该编写子查询吗?
答案 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}}