在官方文件关于FOR XML PATH的说明是:可以 XML 格式撷取 SQL 查询的正式结果。
不论是以上的说明,或是文件列举的资料,其实我不太清楚这个功能要如何使用,
直到实务上遇到需要从DB产出资料的需求后,才对FOR XML PATH有初步的了解。
範例
原始报表资料如下:
可以看到有多笔关于user的栏位值都是重複的,
但因为ProjectName栏位值不同的缘故,
资料被分割成多笔,这在资料管理上是没有问题的,
但如果需要将资料以报表等方式呈现时,会偏好让ProjectName合併在一起,
一名人员只需要显示一笔资料即可,这时候FOR XML PATH就派上用场了~
首先,使用for XML Path('')
针对ProjectName去做合併,
每一笔ProjectName的资料用逗号分隔:
SELECT T1.UnitName, T1.Account, T1.UserName,( SELECT ',' + T2.ProjectName FROM Users T2 WHERE T1.UnitName = T2.UnitName and T1.Account = T2.Account and T1.UserName = T2.UserName for XML Path('')) AS ProjectName FROM Users T1
可以看到ProjectName被合併了,但有资料重複,
以及ProjectName最前方多出一个逗号的问题:
使用DISTINCT
移除重複资料,并用STUFF
把ProjectName最前方的逗号移除:
SELECT DISTINCT T1.UnitName, T1.Account, T1.UserName,STUFF(( SELECT ',' + T2.ProjectName FROM Users T2 WHERE T1.UnitName = T2.UnitName and T1.Account = T2.Account and T1.UserName = T2.UserName for XML Path('') ), 1, 1, '') AS ProjectNameFROM Users T1
最终资料如下:
使用FOR XML PATH将多笔资料组合成一个字串