当前位置:文档之家› SQL Server 中自定义函数和游标应用经典案例

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

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

假设环境如下:
表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 表https://www.doczj.com/doc/c52585905.html, AS 姓名, COUNT(表2.ID) AS 上机次数

FROM 表1 LEFT OUTER JOIN

表2 ON 表https://www.doczj.com/doc/c52585905.html, = 表https://www.doczj.com/doc/c52585905.html,

GROUP BY 表1.名称


上面那个语句是我转载过来的作者写的SQL语句

如果是我的话我会写


解答:
测试用例


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 表https://www.doczj.com/doc/c52585905.html, = @name )

open myCur

fetch next from myCur into @tempStr

set @flag = 0

while @@fetch_status = 0

begin

if @flag = 0

begin

set @nameStr = @temp

Str

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 表https://www.doczj.com/doc/c52585905.html, as 姓名, count(ID) as 上机次数, dbo.GetNameStr(表https://www.doczj.com/doc/c52585905.html,) as 管理员

from 表2

where 表https://www.doczj.com/doc/c52585905.html, in ( select 表https://www.doczj.com/doc/c52585905.html, from 表1 )

group by 表https://www.doczj.com/doc/c52585905.html,



测试结果:


姓名 上机次数 管理员

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

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

在路上 2 马化腾,李大伟



相关主题
文本预览
相关文档 最新文档