关于t中的游标,我有一个问题。当我这样做一个光标,它将结束在一个无休止的循环。
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脚本?在调试游标时,当我从另一个事务插入到该表时,我得到了同样的效果。当我使用“静态”关键字声明游标时,问题就解决了。但是,当我不使用静态关键字时,我对游标的行为感到困惑。
有什么解释吗?
你好,雷托
发布于 2015-11-19 08:03:23
关键是要在循环中读取和插入相同的表(因此它就像“蛇吃自己的尾巴”一样):
光标:
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中构建的。静态游标总是显示游标打开时的结果集。。
以及:
游标不反映数据库中任何影响结果集成员资格的更改或对组成结果集的行的列中值的更改。静态游标在游标打开后不显示插入数据库中的新行,即使它们与游标选择语句的搜索条件匹配
https://stackoverflow.com/questions/33798129
复制相似问题