<%@ page contentType="text/html; charset=gb2312"%> sqlserver中自定义函数和游标应用的经典案例
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

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

假设环境如下:

    表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       马化腾,李大伟

 

(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
sqlserver的几个安全问题(1)
sqlserver的几个安全问题(2)
sqlserver的几个安全问题(3)
sqlserver的几个安全问题(4)
sqlserver的几个安全问题(5)
sqlserver的几个安全问题(6)
 
最近评论:
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(9006)
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(5106)
        
你曾悄悄的来过!
wow gold,wow gold,wow gold,ffxi gil max(3944)
        
冰封的往事!
wow power leveling,wow gold,wow power leveling,wow gold max(3638)
        
冰封的往事!
wow power leveling,wow gold,WoW Gold,wow gold max(8379)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(54)
        
飞舞的传奇!
传世私服,传世私服.传奇世界私服传奇世界私服,传世私服传世私服, 传奇世界私服传奇世界私服.传奇私服传奇私服. max(4294)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号