关于使用游标的问题

hawaii_wx 2005-01-19 05:26:57
小弟近来学习sql,今日发现一游标问题,百思不得其解?于是呼又费劲千辛万苦才找到csdn发贴的方法。下面是问题:
有a表(pro代表省份)
id pro city
1 HB wh
2 HB yc
3 HB wh
4 HB yc
有b表
也是有同a表一样的3个列,但是表b里面没有数据(用于以后存放pro是HB并且city是yc的数据)
有c表
也是有同a表一样的3个列,但是表c里面没有数据(用于以后存放pro是HB并且city是wh的数据)
最后要求用游标实现把a表里符合b表以及c表的要求的数据放到(复制一份的意思)各自的表中

说的有点乱,但是相信我把意思说清楚了
请问有谁可以帮我一下,谢谢了先!
...全文
186 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawaii_wx 2005-01-19
  • 打赏
  • 举报
回复
ok,下次再有搞不懂得问题再到这里发贴!谢谢你们了
icedut 2005-01-19
  • 打赏
  • 举报
回复
游标的书读比较慢
还是少用为好
icedut 2005-01-19
  • 打赏
  • 举报
回复
点击管理
给分就可以了
icedut 2005-01-19
  • 打赏
  • 举报
回复
xluzhong(打麻将一缺三,咋办?)
写得应该可以满足你的要求把
hawaii_wx 2005-01-19
  • 打赏
  • 举报
回复
ok,基本上搞清楚了
谢谢icedut(冰) 和 xluzhong(打麻将一缺三,咋办?)
顺便问下怎么结贴!(好像是和得分有关系)
icedut 2005-01-19
  • 打赏
  • 举报
回复
DECLARE CURSOR
定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。DECLARE CURSOR 接受基于 SQL-92 标准的语法和使用一组 Transact-SQL 扩展的语法。

SQL-92 语法
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]

Transact-SQL 扩展语法
DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]

SQL-92 参数
cursor_name

是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息,请参见使用标识符。

INSENSITIVE

定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,(任何用户)对基表提交的删除和更新都反映在后面的提取中。

SCROLL

指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果指定 SCROLL,则不能也指定 FAST_FORWARD。

select_statement

是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

如果 select_statement 中的子句与所请求的游标类型的功能发生冲突,则 Microsoft® SQL Server™ 隐性地将游标转换为另一种类型。有关更多信息,请参见隐性游标转换。

READ ONLY

Prevents updates made through this cursor.在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。

UPDATE [OF column_name [,...n]]

定义游标内可更新的列。如果指定 OF column_name [,...n] 参数,则只允许修改所列出的列。如果在 UPDATE 中未指定列的列表,则可以更新所有列。

hawaii_wx 2005-01-19
  • 打赏
  • 举报
回复
回复icedut(冰) :
你的例子是用了游标的嵌套吧,看的有点眼花,但还是谢谢你,可以帮我写下关键的代码部分吗?
xluzhong 2005-01-19
  • 打赏
  • 举报
回复
根据你的要求:
fetch next from test_cursor into @i,@spro,@scity
while @@fetch_status=0
begin
if @spro='HB' and @scity='yc'
insert into b values (@i,@spro,@scity)
fetch next from test_cursor into @i,@spro,@scity
else if @spro='HB' and @scity='wh'
insert into c values (@i,@spro,@scity)
fetch next from test_cursor into @i,@spro,@scity
else
fetch next from test_cursor into @i,@spro,@scity
end
.....
icedut 2005-01-19
  • 打赏
  • 举报
回复
update test
--主要是下面的我不会写了
set @i=id
set @spro=pro
set @scity=city

这句话没看懂

insert into xf
values (@i,@spro,@scity)
hawaii_wx 2005-01-19
  • 打赏
  • 举报
回复
顶上去
icedut 2005-01-19
  • 打赏
  • 举报
回复
不帮你写了,给你一个例子看看好了
declare DataSaleS1 scroll cursor
for
select Bar9,Col,Siz,Qty from tmp_XKQuery
Open DataSaleS1
declare @Bar9 char(9)
declare @Siz Char(2)
declare @Col Char(2)

declare @Qty integer

declare @I int
declare @M integer
set @I=1
set @M=@@cursor_rows
while @I<=@M
begin
set @I=@I+1
print @I
print @Bar9
fetch from DataSaleS1 into @Bar9,@Col,@Siz,@Qty

declare DataSaleS2 scroll cursor
for
select Shopno,Bar9,Col,Siz,Qty from Tmp_XKShop
where bar9=@Bar9 AND Siz=@Siz AND Col=@Col AND Qty>1 order by Qty desc
Open DataSaleS2
declare @Bar9S char(9)
declare @SizS Char(2)
declare @ColS Char(2)
declare @ShopNo integer
declare @QtyS integer

declare @J int
declare @N int
set @J=1
set @N=@@cursor_rows
while @J<=@N and @Qty>0
begin
set @J=@J+1

fetch from DataSaleS2 into @ShopNo,@Bar9S,@ColS,@SizS,@QtyS

If @QtyS>=@Qty+1
begin
insert into Tmp_B values (@ShopNo,@Bar9,@Col,@Siz,@qty)
set @Qty=0
end
else
begin
insert into Tmp_B values (@ShopNo,@Bar9,@Col,@Siz,@qtys - 1)
set @Qty=@Qty-@QtyS+1
end
end
Close DataSaleS2

Deallocate DataSaleS2
end
Close DataSaleS1

Deallocate DataSaleS1
hawaii_wx 2005-01-19
  • 打赏
  • 举报
回复
回复idedut:
主要是体现游标的功能
xluzhong 2005-01-19
  • 打赏
  • 举报
回复
需要用游标么?我觉得用游标会不会跟满?
直接插入就可以了
eg:
insert into b
select * from a where pro='HB' and city='yc'

insert into c
select * from b where pro='HB' and city='wh'
icedut 2005-01-19
  • 打赏
  • 举报
回复
为什么还要用游标阿
多麻烦

而且数据量大的时候 熟读很慢
hawaii_wx 2005-01-19
  • 打赏
  • 举报
回复
下面是我自己写的代码,只把大部分代码写出来了,最关键的代码我不会写

create table test
(
id int,
pro varchar(4),
city varchar(4)
)
go

insert into test values(1,'HB','xf')
insert into test values(2,'HB','wh')
insert into test values(3,'HB','xf')
insert into test values(4,'HB','wh')
select * from test

create table xf
(
id int,
pro varchar(4),
city varchar(4)
)
create table wh
(
id int,
pro varchar(4),
city varchar(4)
)
--以下为游标声明
declare @i int
declare @spro varchar(4)
declare @scity varchar(4)
set @i=1
set @spro='aa'
set @scity='xx'
declare test_cursor cursor
scroll dynamic
for
select * from test where city='xf'
for update
--打开游标
open test_cursor
--提取行
fetch first from test_cursor
while @@fetch_status=0
begin
update test
--主要是下面的我不会写了
set @i=id
set @spro=pro
set @scity=city
fetch next from test_cursor into @i,@spro,@scity
print @i
print @spro
print @scity
end
--关闭以及释放
close test_cursor
deallocate test_cursor
hawaii_wx 2005-01-19
  • 打赏
  • 举报
回复
是这个意思,但是要用游标来完成,
icedut 2005-01-19
  • 打赏
  • 举报
回复
insert into b
select * from a where pro='HB' and city='yc'

insert into c
select * from b where pro='HB' and city='wh'

理解的对么

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧