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,'崔莺莺','织布')
3
分组返回行转列
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=种地
加载中,请稍候......