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

 
 

posted on 2014-10-31 14:26  二狗你变了  阅读(471)  评论(0)    收藏  举报

导航