首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游标-声明选择语句多次执行?

问游标-声明选择语句多次执行?
EN

Stack Overflow用户
提问于 2015-11-19 07:56:57
回答 1查看 1.9K关注 0票数 1

关于t中的游标,我有一个问题。当我这样做一个光标,它将结束在一个无休止的循环。

代码语言:javascript
复制
drop table  [dbo].[cursorcheck]
GO

CREATE TABLE [dbo].[cursorcheck](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Wert] [varchar](10) NOT NULL
) ON [PRIMARY]
GO


delete dbo.cursorcheck
GO

insert into dbo.cursorcheck 
select 'Insert'
GO


DECLARE @vendor_id int, @vendor_name nvarchar(50);

DECLARE vendor_cursor CURSOR FOR 

SELECT ID, wert
FROM dbo.cursorcheck 
WHERE wert = 'insert';

OPEN vendor_cursor

FETCH NEXT FROM vendor_cursor 
INTO @vendor_id, @vendor_name

WHILE @@FETCH_STATUS = 0
BEGIN



        insert into dbo.cursorcheck 
        select 'Insert'


    FETCH NEXT FROM vendor_cursor 
    INTO @vendor_id, @vendor_name
END 
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;

我对这种行为有点困惑。这是否意味着要多次执行游标声明的select脚本?在调试游标时,当我从另一个事务插入到该表时,我得到了同样的效果。当我使用“静态”关键字声明游标时,问题就解决了。但是,当我不使用静态关键字时,我对游标的行为感到困惑。

有什么解释吗?

你好,雷托

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-19 08:03:23

关键是要在循环中读取和插入相同的表(因此它就像“蛇吃自己的尾巴”一样):

光标:

代码语言:javascript
复制
DECLARE vendor_cursor CURSOR FOR 
  SELECT ID, wert
  FROM dbo.cursorcheck 
  WHERE wert = 'insert';

和循环:

代码语言:javascript
复制
WHILE @@FETCH_STATUS = 0
BEGIN
    insert into dbo.cursorcheck 
    select 'Insert'

    FETCH NEXT FROM vendor_cursor 
    INTO @vendor_id, @vendor_name
END 

关于第二个问题:当我使用“静态”时,问题就解决了:

STATIC CURSOR 当游标被打开时,静态游标的完整结果集是在tempdb中构建的。静态游标总是显示游标打开时的结果集。。

以及:

游标不反映数据库中任何影响结果集成员资格的更改或对组成结果集的行的列中值的更改。静态游标在游标打开后不显示插入数据库中的新行,即使它们与游标选择语句的搜索条件匹配

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33798129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档