SQL中游标的使用--遍历数据逐行更…

来源:互联网 发布:物业台账软件 编辑:程序博客网 时间:2024/06/08 04:29

--------------------------------------例子1单纯的游标--------------------------------

  create TABLE Table1
    (
       a varchar(10),
       b varchar(10),
       c varchar(10),
       CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
       (
           a ASC
       )
    ) ON[PRIMARY]

    createTABLE Table2
    (
       a varchar(10),
       c varchar(10),
       CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
       (
           a ASC
       )
    ) ON[PRIMARY]
    GO


    Insert intoTable1 values('赵','asds',null)
    Insert intoTable1 values('钱','asds','100')
    Insert intoTable1 values('孙','asds','80')
    Insert intoTable1 values('李','asds',null)

    Insertinto Table2 values('赵','90')
    Insert intoTable2 values('钱','100')
    Insert intoTable2 values('孙','80')
    Insert intoTable2 values('李','95')
    GO

--  drop table Table1
--  drop table Table2

select * from Table1
select * from Table2

declare @name varchar(10)
declare @score varchar(10)
set @name=''
set @score=''
declare mycursor cursor for select a from Table2 where c is notnull
open mycursor
fetch next from mycursor into @name
while(@@fetch_status=0)
begin
-----------------------------------------
select @score=c from Table2 where a=@name
update Table1 set c=@score wherea=@name
-----------------------------------------
fetch next from mycursor into @name
end
close mycursor
deallocate mycursor
go

--------------------------------------例子2存储过程的使用游标------------------------

------------------------------建表----------------------------------
create table #aaa (id varchar(30),name varchar(30),salaryfloat)
go
insert into #aaa values('111','张三',4000)
insert into #aaa values('222','李四',5000)
insert into #aaa values('333','王五',6000)

drop table #aaa
drop table #bbb

create table #bbb (id varchar(30),AddSalary float)
go

insert into #bbb values('111',2000)
insert into #bbb values('222',2000)
insert into #bbb values('333',2000)

select * from #aaa
select * from #bbb
------------------------------建表end----------------------------------

------------------------------建立存储过程和游标----------------------------------
create proc PK_test
as
declare @id varchar(30)
declare @salary float

declare mycursor cursor for selectid,AddSalary from #bbb
open mycursor
fetch next from mycursor into @id,@salary

while(@@fetch_status=0)
begin 
update #aaa set salary=(salary+@salary) where id=@id
fetch next from mycursor into @id,@salary
end
close mycursor
deallocate mycursor
go

exec PK_test

drop proc PK_test


------------------------------建立存储过程和游标结束----------------------------------


--------------------------------------例子3在自定义函数里使用游标--------------------------------功能需求:
问题:
 

假设环境如下:

   表1:     ID,NAME,     QQ,    PHONE,

表中数据:          秦云       10102800 13500000

                    在路上     10378   13600000

                    LEO        10000   13900000

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

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

               秦云   2005-1-1  马化腾

                在路上  2005-1-1  马化腾

                秦云   2005-1-1 李大伟

                在路上2005-1-1  李大伟

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

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

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

              在路上                    马化腾,李大伟

              LEO                  

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

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),'李大伟')

go

select * from 表1
select * from 表2

 

-----------------------------------------------------灵活的函数----------------------------------createfunction GetNameStr(@name nvarchar(10))

returns nvarchar(800)

as

begin

    declare@nameStr nvarchar(800)

    declare@tempStr nvarchar(800)

    declare@flag int

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

    openmyCur

    fetchnext from myCur into @tempStr

    set @flag= 0

    while@@fetch_status = 0

   begin--while 开始

    if@flag = 0 --判断,如果是第一次

   begin

    set@nameStr = @tempStr

   end

   else

   begin   --否则,进行处理

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

   end

   set @flag= @flag + 1  --循环++

   fetch nextfrom myCur into @tempStr

   end--while 结束

    closemyCur

   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


select * from 表1
select * from 表2

,count(ID)

select 表2.NAME,count(id),管理员 from 表2 where表2.Name  in ( select NAME from 表1 )
group by 表2.name

 

0 0
原创粉丝点击