加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SQLServerFORXMLPATH简单使用

(2019-08-02 16:58:43)
标签:

sqlserver

forxmlpath

group

转义

SQL Server FOR XML PATH 应用主要是查询结果从表的形式改为 xml 格式

一 创建表,并插入数据

 DECLARE @t1 table(id int , name nvarchar(50));  
 INSERT INTO @t1 (id,name) values (1,'张生') ,(2,'崔莺莺')

二 返回节点集合

1 返回默认的节点 row 集合

select id,name from @T1 FOR XML PATH 

 
 < row >  < id > 1 < /id >  < name > 张生 < /name >  < /row > 
 < row >  < id > 2 < /id >  < name > 崔莺莺 < /name >  < /row > 

2 返回指明的节点 set 集合

select id,name from @T1 FOR XML PATH('set') 
 
 < set >  < id > 1 < /id >  < name > 张生 < /name >  < /set > 
 < set >  < id > 2 < /id >  < name > 崔莺莺 < /name >  < /set > 

3 返回不显示上级节点的 集合

select id,name from @T1 FOR XML PATH('') 
 
 < id > 1 < /id >  < name > 张生 < /name >  < id > 2 < /id >  < name > 崔莺莺 < /name > 

4 返回自定义形式的 集合

 select CAST(id AS varchar) + ',',name + '','|' from @T1 FOR XML PATH('')
 
1,张生|2,崔莺莺|


三  通过 group 行转列

1 创建临时表

 DECLARE @t1 table(id int , name nvarchar(50), work nvarchar(50)); 
 
2 插入数据

 insert into @t1 (id,name,work) values (1,'张生','种地'),
  (2,'崔莺莺','纺线'), (3,'张生','拔草')  , (4,'崔莺莺','织布')

分组返回行转列 

 SELECT b.name, LEFT(workList,LEN(workList)-1)  AS work
 FROM (  
      SELECT CAST(name AS varchar) name,  
             (SELECT  CAST(work AS varchar) +'$'  FROM @T1 WHERE name=a.name  FOR XML PATH('')) AS workList 
      FROM @t1 a   
     GROUP BY name  
 )b  

4 结果为

name work
崔莺莺 纺线$织布$
张生 种地$拔草$


四 避免转义

 1 默认从数据库内抽出的网址有特殊字符和参数,自动转义

   SELECT 'http://pc.cn/name= < 张 >  & work=种地' FOR XML PATH('') 

   得到记过如下:
   http://pc.cn/name=<> & work=种地

  自动把其中的        &  都给转义了,结果就无法转到指定的地址

 2 不转义 SELECT ( xxxx, TYPE).value('.','nvarchar(MAX)')

  SELECT (  SELECT 'http://pc.cn/name= < 张 >  & work=种地' FOR XML PATH('') ,TYPE).value('.','nvarchar(MAX)') 

(无列名)
http://pc.cn/name= < 张 >  & work=种地

 3 再给出结果的列名 address

  SELECT (  SELECT 'http://pc.cn/name= < 张 >  & work=种地' FOR XML PATH('') ,TYPE).value('.','nvarchar(MAX)') AS address

 address
 http://pc.cn/name= < 张 >  & work=种地








0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有