SQL中游标的使用--遍历数据逐行更…
2016-03-21 10:50
204 查看
--------------------------------------例子1
单纯的游标--------------------------------
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON
[PRIMARY]
create
TABLE Table2
(
a varchar(10),
c varchar(10),
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON
[PRIMARY]
GO
Insert into
Table1 values('赵','asds',null)
Insert into
Table1 values('钱','asds','100')
Insert into
Table1 values('孙','asds','80')
Insert into
Table1 values('李','asds',null)
Insert
into Table2 values('赵','90')
Insert into
Table2 values('钱','100')
Insert into
Table2 values('孙','80')
Insert into
Table2 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 not
null
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 where
a=@name
-----------------------------------------
fetch next from mycursor into @name
end
close mycursor
deallocate mycursor
go
--------------------------------------例子2
存储过程的使用游标------------------------
------------------------------建表----------------------------------
create table #aaa (id varchar(30),name varchar(30),salary
float)
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 select
id,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,
表中数据:
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),'李大伟')
go
select * from 表1
select * from 表2
-----------------------------------------------------灵活的函数----------------------------------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--while 开始
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--while 结束
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
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
单纯的游标--------------------------------
create TABLE Table1
(
a varchar(10),
b varchar(10),
c varchar(10),
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON
[PRIMARY]
create
TABLE Table2
(
a varchar(10),
c varchar(10),
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
a ASC
)
) ON
[PRIMARY]
GO
Insert into
Table1 values('赵','asds',null)
Insert into
Table1 values('钱','asds','100')
Insert into
Table1 values('孙','asds','80')
Insert into
Table1 values('李','asds',null)
Insert
into Table2 values('赵','90')
Insert into
Table2 values('钱','100')
Insert into
Table2 values('孙','80')
Insert into
Table2 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 not
null
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 where
a=@name
-----------------------------------------
fetch next from mycursor into @name
end
close mycursor
deallocate mycursor
go
--------------------------------------例子2
存储过程的使用游标------------------------
------------------------------建表----------------------------------
create table #aaa (id varchar(30),name varchar(30),salary
float)
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 select
id,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,
表中数据:
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),
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
-----------------------------------------------------灵活的函数----------------------------------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--while 开始
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--while 结束
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
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
相关文章推荐
- sql ROW_NUMBER() 排序函数
- Sql或String字符串太长的写法
- SQL中的CASE
- 数据库操作代码
- 在SQL Server和Access中清空表并重…
- SQL Server数据库自增长标识列的更…
- mysql 执行状态分析 show processlist
- 数据类型的选用
- sql isnull函数的使用
- MYSQL的随机抽取实现方法
- oracle集合类型,标量类型,记录类型辨析
- C#向ACCESS数据库插入空值
- SQL函数
- mysql error:Table 'performance_schema.session_variables' doesn't exist
- mysql replace()函数
- C#向ACCESS数据库插入空值
- Oracle内正则替换Clob类型内的字符串
- {dede:sql 中如何传入参数,
- WinForms应用程序操作Access数据库…
- WinForms应用程序操作Access数据库…