您的位置:首页 > 数据库

数据库查询XML结构,FOR XML PATH 语句的应用

2010-05-06 11:56 218 查看
/*
数据库查询XML结构,FOR XML PATH 语句的应用

*/

FOR XML PATH 语句的应用:

CREATE TABLE TempTable(UserID int , UserName nvarchar(50));
insert into TempTable (UserID,UserName) values (1,'a')
insert into TempTable (UserID,UserName) values (2,'b')

select UserID,UserName from TempTable FOR XML PATH
-----运行这段脚本,将生成如下结果:

<row>
<UserID>1</UserID>
<UserName>a</UserName>
</row>
<row>
<UserID>2</UserID>
<UserName>b</UserName>
</row>
----大家可以看到两行数据生成了两个节点,修改一下PATH的参数:

select UserID,UserName from TempTable FOR XML PATH('lzy')
----再次运行上述脚本,将生成如下的结果:

<lzy>
<UserID>1</UserID>
<UserName>a</UserName>
</lzy>
<lzy>
<UserID>2</UserID>
<UserName>b</UserName>
</lzy>
----可以看到节点变成,其实PATH() 括号内的参数是控制节点名称的,这样的话大家可以看一下如果是空字符串(不是没有参数)会是什么结果?

select UserID,UserName from TempTable FOR XML PATH('')
----执行上面这段脚本将生成结果:

<UserID>1</UserID>
<UserName>a</UserName>
<UserID>2</UserID>
<UserName>b</UserName>
---这样就不显示上级节点了,
---大家知道在 PATH 模式中,列名或列别名被作为 XPath 表达式来处理,
---也就是说,是列的名字,这样大胆试验一下不给指定列名和别名会是怎么样?

select cast(userid as varchar) +','+ username from TempTable for xml path('')
select CAST(UserID AS varchar) + '',UserName + '' from TempTable FOR XML PATH('')
---运行上面这句将生成结果

----1a2b

----所有数据都生成一行,而且还没有连接字符,这样的数据可能对大家没有用处,还可以再变化一下:

select CAST(UserID AS varchar) + ',',UserName + '',';' from TempTable FOR XML PATH('')
select CAST(userid as varchar) +',' +username +';' from TempTable for xml path('')
----生成结果

1,a;2,b;

----大家现在明白了吧,可以通过控制参数来生成自己想要的结果,例如:

select '{' + CAST(UserID AS varchar) + ',','"' +UserName + '"','}' from TempTable FOR XML PATH('')
生成结果

{1,"a"}{2,"b"}

----还可以生成其他格式,大家可以根据自己需要的格式进行组合。

----下面是一个数据统计的应用,希望大家可以通过下面的实例想到更多的应用

if OBJECT_ID('t1')is not null drop table t1
create table t1(UserID int , UserName nvarchar(50),CityName nvarchar(50))
insert into t1 (UserID,UserName,CityName) values (1,'a','上海')
insert into t1 (UserID,UserName,CityName) values (2,'b','北京')
insert into t1 (UserID,UserName,CityName) values (3,'c','上海')
insert into t1 (UserID,UserName,CityName) values (4,'d','北京')
insert into t1 (UserID,UserName,CityName) values (5,'e','上海')
---需要生成如下:
/*
北京 b,d
上海 a,c,e
*/
select * from t1 order by CityName

select cityname,substring(userlist,1,LEN(userlist)-1)as userlist
from (
select distinct cityname,
(
select username+',' from t1 where CityName=a.cityname for xml path('')
)as userlist
from t1 a
)b

SELECT B.CityName,LEFT(UserList,LEN(UserList)-1) FROM (
SELECT CityName,
(SELECT UserName+',' FROM t1 WHERE CityName=A.CityName FOR XML PATH('')) AS UserList
FROM t1 A
GROUP BY CityName
) B

/*
----生成结果(每个城市的用户名)

北京 b,d
上海 a,c,e
*/

-----例子二

----

IF object_id('t1')IS NOT NULL DROP TABLE t1
Create table t1(eoID int,docID INT,handle VARCHAR(10))--- --eoID 办理单位ID,docID--办理文件ID handle--办理类型
INSERT INTO t1
SELECT 1,100,'主办' UNION ALL
SELECT 3,100,'会办' UNION ALL
SELECT 2,102,'主办' UNION ALL
SELECT 1,102,'主办' UNION ALL
SELECT 1,103,'主办' UNION ALL
SELECT 3,103,'主办' UNION ALL
SELECT 3,104,'主办' UNION ALL
SELECT 1,104,'会办' UNION ALL
SELECT 2,104,'会办' UNION ALL
SELECT 1,105,'主办' UNION ALL
SELECT 3,105,'会办' UNION ALL
SELECT 2,105,'会办'

SELECT * FROM T1 ORDER BY eoID

---1
SELECT eoid,
总数=COUNT(*),
主办数=sum(CASE WHEN handle='主办' THEN 1 ELSE 0 END ),
主办情况=stuff((select cast(docID as varchar)+',' from t1 where eoid=a.eoID and handle ='主办' for XML path('') ),1,1,''),
会办数=SUM(case when handle ='会办' then 1 else 0 end ),
会办情况=stuff((select CAST(docID as varchar)+',' from t1 where eoid=a.eoID and handle ='会办' for XML path('')),1,1,'')
from t1 a
group by eoid

---2
select eoid,zongshu,SUBSTRING(zhqk,1,LEN(zhqk)-1),hbs,SUBSTRING (hbqk,1,LEN(hbqk)-1)
from
(
SELECT eoid,
zongshu=COUNT(*),
zbs=sum(CASE WHEN handle='主办' THEN 1 ELSE 0 END ),
zhqk=(select cast(docID as varchar)+',' from t1 where eoid=a.eoID and handle ='主办' for XML path('') ),
hbs=SUM(case when handle ='会办' then 1 else 0 end ),
hbqk=(select CAST(docID as varchar)+',' from t1 where eoid=a.eoID and handle ='会办' for XML path(''))
from t1 a
group by eoid
)c

/*
select * from
(
select distinct eoid,handle,
(
select cast(docid as varchar)+',' from t1 where eoid=a.eoID and handle ='主办' for xml path('')
)as docid
from t1 a

union all

select distinct eoid,handle,
(
select cast(docid as varchar)+',' from t1 where handle=a.handle and handle ='会办' for xml path('')
)as docid
from t1 a
)c
where docid is not null
order by eoID
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: