sql server游标频繁的打开和关闭

u013185888 2017-10-20 01:46:48
如题:
定义一个游标
declare @test cursor
set @test cursor for select * from #testtable;
open @test;
declare @i
@i = 1
while @i>0
begin
......
fetch next from @test into ...
while @@FETCH_STATUS = 0
begin
......
fetch next from @test into ...
end
close @test;
set @test cursor for select * from #testtable;
open @test;
end

求问各位大神,这样写是否存在什么隐患。如果有问题,能否给我一点好的办法,让我实现这个操作。一直循环临时表。谢谢!
...全文
479 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
u013185888 2017-10-20
  • 打赏
  • 举报
回复
引用 1 楼 z10843087 的回复:
其实不建议用游标。另外,为什要这么写,把他关了又打开
重复读取这个表,不关闭重新赋值打开,while循环进不去
吉普赛的歌 2017-10-20
  • 打赏
  • 举报
回复
引用 5 楼 u013185888 的回复:
看了您这个,恍然大悟,游标弃了。感谢
没事就结贴吧
u013185888 2017-10-20
  • 打赏
  • 举报
回复
引用 3 楼 qq_37170555 的回复:
[quote=引用 楼主 u013185888 的回复:] 如题: 定义一个游标 declare @test cursor set @test cursor for select * from #testtable; open @test; declare @i @i = 1 while @i>0 begin ...... fetch next from @test into ... while @@FETCH_STATUS = 0 begin ...... fetch next from @test into ... end close @test; set @test cursor for select * from #testtable; open @test; end 求问各位大神,这样写是否存在什么隐患。如果有问题,能否给我一点好的办法,让我实现这个操作。一直循环临时表。谢谢!

DECLARE @test CURSOR  
FOR SELECT * FROM   #testtable
OPEN @test

DECLARE @i
set @i = 1
WHILE @i > 0
BEGIN
    ......
    FETCH NEXT FROM @test INTO ...
    WHILE @@FETCH_STATUS = 0
    BEGIN
        ......
        FETCH NEXT FROM @test INTO ...
    END
    CLOSE @test
    DEALLOCATE @test
END
直接这样不就行了吗,为啥要关了再开啊[/quote] 我是要循环这个表n次 试过不重复打开,发现没用。
u013185888 2017-10-20
  • 打赏
  • 举报
回复
引用 4 楼 yenange 的回复:
不用游标来循环:
--------------- 创建测试的临时表 BEGIN -------------------
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
SET NOCOUNT ON
--插入 10 行随机字符串到临时表
SELECT LEFT(NEWID(),5) AS n
INTO #tmp 
FROM MASTER.dbo.spt_values AS sv 
WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 10 
--------------- 创建测试的临时表 END -------------------

--为临时表添加一个序号列,并作为主键
ALTER TABLE #tmp ADD rowNum INT IDENTITY(1,1) NOT NULL
ALTER TABLE #tmp ADD CONSTRAINT PK_tmp_xxx PRIMARY KEY (rowNum)

DECLARE @i INT,@iMax INT,@n VARCHAR(20)
SELECT @i=1,@iMax=MAX(rowNum) FROM #tmp

--以序号列来循环
WHILE @i<=@iMax
BEGIN
	SELECT @n=n FROM #tmp WHERE rowNum=@i
	PRINT CAST(@i AS VARCHAR(10))+'    '+@n
	SET @i=@i+1
END
/*
1    1EDAB
2    30421
3    3B28A
4    D3CE7
5    594EA
6    989E5
7    83E98
8    EFE96
9    57C00
10    ED03C
*/
看了您这个,恍然大悟,游标弃了。感谢
吉普赛的歌 2017-10-20
  • 打赏
  • 举报
回复
不用游标来循环:
--------------- 创建测试的临时表 BEGIN -------------------
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
SET NOCOUNT ON
--插入 10 行随机字符串到临时表
SELECT LEFT(NEWID(),5) AS n
INTO #tmp 
FROM MASTER.dbo.spt_values AS sv 
WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 10 
--------------- 创建测试的临时表 END -------------------

--为临时表添加一个序号列,并作为主键
ALTER TABLE #tmp ADD rowNum INT IDENTITY(1,1) NOT NULL
ALTER TABLE #tmp ADD CONSTRAINT PK_tmp_xxx PRIMARY KEY (rowNum)

DECLARE @i INT,@iMax INT,@n VARCHAR(20)
SELECT @i=1,@iMax=MAX(rowNum) FROM #tmp

--以序号列来循环
WHILE @i<=@iMax
BEGIN
	SELECT @n=n FROM #tmp WHERE rowNum=@i
	PRINT CAST(@i AS VARCHAR(10))+'    '+@n
	SET @i=@i+1
END
/*
1    1EDAB
2    30421
3    3B28A
4    D3CE7
5    594EA
6    989E5
7    83E98
8    EFE96
9    57C00
10    ED03C
*/
听雨停了 2017-10-20
  • 打赏
  • 举报
回复
引用 楼主 u013185888 的回复:
如题: 定义一个游标 declare @test cursor set @test cursor for select * from #testtable; open @test; declare @i @i = 1 while @i>0 begin ...... fetch next from @test into ... while @@FETCH_STATUS = 0 begin ...... fetch next from @test into ... end close @test; set @test cursor for select * from #testtable; open @test; end 求问各位大神,这样写是否存在什么隐患。如果有问题,能否给我一点好的办法,让我实现这个操作。一直循环临时表。谢谢!

DECLARE @test CURSOR  
FOR SELECT * FROM   #testtable
OPEN @test

DECLARE @i
set @i = 1
WHILE @i > 0
BEGIN
    ......
    FETCH NEXT FROM @test INTO ...
    WHILE @@FETCH_STATUS = 0
    BEGIN
        ......
        FETCH NEXT FROM @test INTO ...
    END
    CLOSE @test
    DEALLOCATE @test
END
直接这样不就行了吗,为啥要关了再开啊
顺势而为1 2017-10-20
  • 打赏
  • 举报
回复
游标嵌套比较慢, 如果没有其它直接得到结果的办法, 用while 还好点.
OwenZeng_DBA 2017-10-20
  • 打赏
  • 举报
回复
其实不建议用游标。另外,为什要这么写,把他关了又打开

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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