Cursor - 声明Select-Statement多次执行?

时间:2015-11-19 07:56:58

标签: sql sql-server tsql static cursor

我在t-sql中有关于游标的问题。 当我做这样的光标时,它将以无限循环结束。

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;

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

任何解释?

此致 雷托

1 个答案:

答案 0 :(得分:0)

关键是你试着在循环中读取并插入相同的表(所以它就像“吃自己的尾巴的蛇”):

光标:

DECLARE vendor_cursor CURSOR FOR 
  SELECT ID, wert
  FROM dbo.cursorcheck 
  WHERE wert = 'insert';

循环:

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中构建的   光标已打开。静态游标始终显示结果集   是光标打开的时候。

  

游标不反映数据库中所做的任何更改   影响结果集的成员资格或更改   组成结果集的行的列中的值。 :一种   静态游标不会显示数据库中插入的新行   光标被打开,即使它们匹配的搜索条件   游标SELECT语句