sql for xml
拼接相同类的列数据:
数据库中记录着员工的工作经历,一个经历一条数据,现有一个需求要导出员工的工作经历到Excel,工作经历拼接成一行数据。
测试的数据表如下

需要处理得到的结果如下(多个经历用了逗号隔开):

SQL语句:
SELECT empID, LEFT(workExperience,LEN(workExperience)-1) AS workExperience FROM (
SELECT empID,(SELECT Experience+',' FROM dbo.Employee WHERE empID =A.empid FOR XML PATH(''))AS workExperience
FROM dbo.Employee A GROUP BY A.empID
)B
Select 的查询结果会作为行集返回,但是你同样可以在sql中指定for xml子句使得查询作为xml来检索。在for xml子句中,可以指定以下模式之一:RAW 、AUTO、EXPLICIT和PATH。
RAW模式:
SELECT TOP 3 id,NAME,ClientCode FROM dbo.Customer FOR XML RAW
结果:
<row id="94" NAME="1st paygateway.net" ClientCode="C-NA-TL-0063" /> <row id="95" NAME="3D NURI CO LTD" ClientCode="C-AS-TL-0049" /> <row id="96" NAME="3-D TV" ClientCode="C-NA-TL-0064" />
AUTO模式:
SELECT TOP 3 id,NAME,ClientCode FROM dbo.Customer FOR XML AUTO
结果:
<dbo.Customer id="94" NAME="1st paygateway.net" ClientCode="C-NA-TL-0063" /> <dbo.Customer id="95" NAME="3D NURI CO LTD" ClientCode="C-AS-TL-0049" /> <dbo.Customer id="96" NAME="3-D TV" ClientCode="C-NA-TL-0064" />
PATH模式
在PATH模式中,节点名称可以使列名也可以通过别名指定又或者根本不指定,不指定的情况下就只显示节点内数据;
根节点可以指定也可以不指定,不指定情况下默认为"row",并且根节点指定为""的情况下可以完全取消根节点的显示。
默认:
SELECT TOP 3 id,NAME,ClientCode FROM dbo.Customer FOR XML PATH
结果:
<row> <id>94</id> <NAME>1st paygateway.net</NAME> <ClientCode>C-NA-TL-0063</ClientCode> </row> <row> <id>95</id> <NAME>3D NURI CO LTD</NAME> <ClientCode>C-AS-TL-0049</ClientCode> </row> <row> <id>96</id> <NAME>3-D TV</NAME> <ClientCode>C-NA-TL-0064</ClientCode> </row>
指定别名:
SELECT TOP 3 id,NAME,ClientCode FROM dbo.Customer FOR XML PATH('cmj')
<cmj> <id>94</id> <NAME>1st paygateway.net</NAME> <ClientCode>C-NA-TL-0063</ClientCode> </cmj> <cmj> <id>95</id> <NAME>3D NURI CO LTD</NAME> <ClientCode>C-AS-TL-0049</ClientCode> </cmj> <cmj> <id>96</id> <NAME>3-D TV</NAME> <ClientCode>C-NA-TL-0064</ClientCode> </cmj>
去掉根节点名称:
SELECT TOP 3 id,NAME,ClientCode FROM dbo.Customer FOR XML PATH('')
结果:
<id>94</id> <NAME>1st paygateway.net</NAME> <ClientCode>C-NA-TL-0063</ClientCode> <id>95</id> <NAME>3D NURI CO LTD</NAME> <ClientCode>C-AS-TL-0049</ClientCode> <id>96</id> <NAME>3-D TV</NAME> <ClientCode>C-NA-TL-0064</ClientCode>
去掉根节点和子节点名称:
SELECT TOP 3 ClientCode+' ' FROM dbo.Customer FOR XML PATH('')
结果:
C-NA-TL-0063 C-AS-TL-0049 C-NA-TL-0064
SELECT TOP 3 ClientCode+', ' FROM dbo.Customer FOR XML PATH('')
C-NA-TL-0063, C-AS-TL-0049, C-NA-TL-0064,
EXPLICIT模式:复杂
相关的sql for xml 可参考:http://www.cnblogs.com/kenshincui/archive/2011/12/31/2309217.html
浙公网安备 33010602011771号