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

 
SQL Server 中 自定义函数 和 游标 应用的经典案例.doc
假设环境如下:

   
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       马化腾 , 李大伟
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值