在sqlServer中如何用游标遍历表??请进····

lxy_lxy 2008-09-19 10:06:26
如题:
if exists(select * from sysobjects where name='A')
drop table A
create table A
(
Aid int identity(1,1) primary key,
Aname varchar(50)
)
go

insert into a(aname) values('a')
insert into a(aname) values('b')
insert into a(aname) values('c')
insert into a(aname) values('d')

if exists(select * from sysobjects where name='B')
drop table B
create table B
(
Bid int identity(1,1) primary key,
Bname varchar(50)
)
go


if exists(select * from sysobjects where name='p')
drop proc p

CREATE PROCEDURE p
AS
BEGIN
如何在此用游标将 A 表中所有数据添加到 B 表中???? END
GO
...全文
369 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxy_lxy 2008-09-19
  • 打赏
  • 举报
回复
恩·1··我知道了···谢谢····
brallow 2008-09-19
  • 打赏
  • 举报
回复
加到最后:

Declare @Id int
Declare @Name varchar(10)
DECLARE TabA CURSOR FOR
SELECT aid, aname
FROM AA

Open TabA
Fetch Next From TabA into @Id,@Name
while(@@FETCH_STATUS=0)
begin
insert into BB values(@Id,@Name)
Fetch Next From TabA into @Id,@Name
end

Close TabA
DEALLOCATE TabA

brallow 2008-09-19
  • 打赏
  • 举报
回复
加上个:
DEALLOCATE TabA;
呵呵,着急忘记了……
lxy_lxy 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 phy 的回复:]
刚测试通过了的

SQL code
Declare @Id int
Declare @Name varchar(10)
DECLARE TabA CURSOR FOR
SELECT aid, aname
FROM AA

Open TabA


Fetch Next From TabA into @Id,@Name
while(@@FETCH_STATUS=0)
begin
insert into BB values(@Id,@Name)
Fetch Next From TabA into @Id,@Name
end

Close TabA
[/Quote]
我执行了两便后:

服务器: 消息 16915,级别 16,状态 1,过程 p,行 7
名为 'TabA' 的游标已存在。
服务器: 消息 16943,级别 16,状态 3,过程 p,行 10
未能完成游标操作,因为在声明游标后,表架构有更改。
服务器: 消息 16917,级别 16,状态 2,过程 p,行 13
游标未打开。
服务器: 消息 16917,级别 16,状态 1,过程 p,行 20
游标未打开。

怎末解决??
caofan520 2008-09-19
  • 打赏
  • 举报
回复


DECLARE @CityName NVARCHAR(100)

DECLARE table_cur CURSOR FOR
SELECT top 10 CityName FROM City

OPEN table_cur
FETCH NEXT FROM table_cur INTO @CityName

WHILE( @@fetch_status = 0)

BEGIN
PRINT @CityName
FETCH NEXT FROM table_cur INTO @CityName
END
DEALLOCATE table_cur
hzg_1998 2008-09-19
  • 打赏
  • 举报
回复
 Delcare @name varchar(50)
Declare MyCursor Cursor for
select Aname from A
Open MyCursor
FETCH NEXT FROM Aname into @name
WHILE @@FETCH_STATUS = 0
BEGIN
insert into B(BName) values(@name)
FETCH NEXT FROM MyCursor into @name
END
CLOSE MyCursor
DEALLOCATE MyCursor
brallow 2008-09-19
  • 打赏
  • 举报
回复
刚测试通过了的

Declare @Id int
Declare @Name varchar(10)
DECLARE TabA CURSOR FOR
SELECT aid, aname
FROM AA

Open TabA


Fetch Next From TabA into @Id,@Name
while(@@FETCH_STATUS=0)
begin
insert into BB values(@Id,@Name)
Fetch Next From TabA into @Id,@Name
end

Close TabA
ustbwuyi 2008-09-19
  • 打赏
  • 举报
回复
自己改一下哈,我这里没装SS,另外这里写错了

IF record%ISOPEN THEN
CLOSE record;

change as

IF cursor1%ISOPEN THEN
CLOSE cursor1 ;

lxy_lxy 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ustbwuyi 的回复:]
Field1 VARCHAR(1);


CURSOR cursor1 IS --定义游标
SELECT Field1 FROM TableA
BEGIN

IF NOT cursor1 %ISOPEN THEN --打开游标
OPEN cursor1 ;
END IF;

LOOP --循环游标
FETCH cursor1 --游标读数据
INTO Field1;
EXIT WHEN cursor1%NOTFOUND;

Insert into B(field) values(Field1);
End Loop;
IF record%ISOPEN THEN --…
[/Quote]
这是 oracle ,区别还是很大的,我想用的是在 sqlserver 中····
cco3322 2008-09-19
  • 打赏
  • 举报
回复
游标效率很低滴

最好象1楼说的
ustbwuyi 2008-09-19
  • 打赏
  • 举报
回复
Field1 VARCHAR(1);


CURSOR cursor1 IS --定义游标
SELECT Field1 FROM TableA
BEGIN

IF NOT cursor1 %ISOPEN THEN --打开游标
OPEN cursor1 ;
END IF;

LOOP --循环游标
FETCH cursor1 --游标读数据
INTO Field1;
EXIT WHEN cursor1%NOTFOUND;

Insert into B(field) values(Field1);
End Loop;
IF record%ISOPEN THEN --关闭游标
CLOSE record;
END IF;
lxy_lxy 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ustbwuyi 的回复:]
没装SQLSERVER,只会Oracle下的,自己稍微改一下把


Field1 VARCHAR(1);


CURSOR cursor1 IS
SELECT Field1 FROM TableA
BEGIN

IF NOT cursor1 %ISOPEN THEN
OPEN cursor1 ;
END IF;

LOOP
FETCH cursor1
INTO Field1;
EXIT WHEN cursor1%NOTFOUND;

Insert into B(field) values(Field1);
End Loop;
IF record%ISOPEN THEN
CLOSE record;
END IF;
[/Quote]
可是在 sqlserver 中这样好像不行吧····在sqlserver中怎么弄啊···
ustbwuyi 2008-09-19
  • 打赏
  • 举报
回复
游标效率不高,用的时候需慎重

lxy_lxy 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 phy 的回复:]
如果是插入A表中所有行,请参考我上面的方法。
如果是插入A表中部分行,请首先考虑有没有可能通过where,group by 等方法得到所需要的行。
如果仍然不行,最后才考虑使用游标。
游标的方法,稍后放上。
[/Quote]
我就是想知道这样游标怎么用 ·····我还有其他用途
brallow 2008-09-19
  • 打赏
  • 举报
回复
如果是插入A表中所有行,请参考我上面的方法。
如果是插入A表中部分行,请首先考虑有没有可能通过where,group by 等方法得到所需要的行。
如果仍然不行,最后才考虑使用游标。
游标的方法,稍后放上。
ustbwuyi 2008-09-19
  • 打赏
  • 举报
回复
没装SQLSERVER,只会Oracle下的,自己稍微改一下把



Field1 VARCHAR(1);


CURSOR cursor1 IS
SELECT Field1 FROM TableA
BEGIN

IF NOT cursor1 %ISOPEN THEN
OPEN cursor1 ;
END IF;

LOOP
FETCH cursor1
INTO Field1;
EXIT WHEN cursor1%NOTFOUND;

Insert into B(field) values(Field1);
End Loop;
IF record%ISOPEN THEN
CLOSE record;
END IF;
brallow 2008-09-19
  • 打赏
  • 举报
回复

insert into B (Bid,Bname)
select Aid,Aname from A


为什么要用游标插入呢?直接

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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