分享
 
 
 

SQL Server 中 自定义函数 和 游标 应用的经典案例

王朝mssql·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

这是网友的问题,我当时立马给出了自己的解决方案,但是没有想到中间有点小问题,发现后经过自己仔细调试,完全得到正确结果后,那个网友已经结帖了。我的代码遂成为鸡肋,食之无味,弃之可惜。但是我觉得我的代码确实还是挺经典的,所以整理了一下,供各位网友欣赏。

问题:

假设环境如下:

表1: ID, NAME, QQ, PHONE,

表中数据: 1 秦云 10102800 13500000

2 在路上 10378 13600000

3 LEO 10000 13900000

表2: ID, NAME, 上机时间,管理员,

表中数据: 1 秦云 2004-1-1 李大伟

2 秦云 2005-1-1 马化腾

3 在路上 2005-1-1 马化腾

4 秦云 2005-1-1 李大伟

5 在路上 2005-1-1 李大伟

实现目的:从表1中取所有人员列表,从表2中取上机次数和管理员.

上机人员名单 上机次数 管理员(上这几次机的每个管理员都列出来)

秦云 3 李大伟,马化腾,李大伟

在路上 2 马化腾,李大伟

LEO 0

如果不算管理员那一列的话,我是这样写的。

SELECT 表1.NAME AS 姓名, COUNT(表2.ID) AS 上机次数

FROM 表1 LEFT OUTER JOIN

表2 ON 表1.NAME = 表2.NAME

GROUP BY 表1.名称

解答:

测试用例

create table 表1( --drop table 表1

ID int,

NAME varchar(10),

QQ varchar(10),

PHONE varchar(20)

)

insert into 表1 values(1 ,'秦云' ,'10102800' ,'13500000')

insert into 表1 values(2 ,'在路上' ,'10378' ,'13600000')

insert into 表1 values(3 ,'LEO' ,'10000' ,'13900000')

create table 表2( --drop table 表2

ID int,

NAME varchar(10) ,

上机时间 datetime,

管理员 varchar(10)

)

insert into 表2 values(1,'秦云' ,cast('2004-1-1' as datetime),'李大伟')

insert into 表2 values(2,'秦云' ,cast('2005-1-1' as datetime),'马化腾')

insert into 表2 values (3,'在路上' ,cast('2005-1-1' as datetime),'马化腾')

insert into 表2 values(4,'秦云' ,cast('2005-1-1' as datetime),'李大伟')

insert into 表2 values(5,'在路上' ,cast('2005-1-1' as datetime),'李大伟')

程序部分

create function GetNameStr(@name nvarchar(10))

returns nvarchar(800)

as

begin

declare @nameStr nvarchar(800)

declare @tempStr nvarchar(800)

declare @flag int

declare myCur cursor for ( select 管理员 from 表2 where 表2.NAME = @name )

open myCur

fetch next from myCur into @tempStr

set @flag = 0

while @@fetch_status = 0

begin

if @flag = 0

begin

set @nameStr = @tempStr

end

else

begin

set @nameStr = @nameStr + ',' + @tempStr

end

set @flag = @flag + 1

fetch next from myCur into @tempStr

end

close myCur

deallocate myCur

return @nameStr

end

select 表2.NAME as 姓名, count(ID) as 上机次数, dbo.GetNameStr(表2.NAME) as 管理员

from 表2

where 表2.NAME in ( select 表1.NAME from 表1 )

group by 表2.NAME

测试结果:

姓名 上机次数 管理员

--------------------------------------------------------------

秦云 3 李大伟,马化腾,李大伟

在路上 2 马化腾,李大伟

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有