我在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关键字时,我对光标的行为感到困惑。
任何解释?
此致 雷托
答案 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语句