【问题标题】:Cursor is repeating first record forever光标永远重复第一条记录
【发布时间】:2021-05-26 09:58:17
【问题描述】:

谁能告诉我我的代码有什么问题。我只是想遍历一个有 2 条记录的表并让它返回 2 条记录。但正如您在下图中看到的那样,它一直在重复第一条记录(永远,直到我点击取消)。谢谢

   SET NOCOUNT ON -- Improves performance by not returning number of rows affected

--General Variables
DECLARE @ImportGUID uniqueidentifier =NEWID() -- Declares and sets a new Unique number. Can be used to remove records at a later stage

--Cursor Variables
DECLARE @FirstNameVariable varchar(50)
DECLARE @SurnameVariable varchar(50)

PRINT 'Starting import ' + CONVERT(varchar(255), @ImportGUID); --just display this on the screen

--Declare the first cursor which will loop through a table collecting data
DECLARE NewPersonTableImportCursor CURSOR FOR
SELECT Firstname, Surname 
from dbo.A_NewPersonTable

--Open NewPersonTableImportCursor
OPEN NewPersonTableImportCursor
--Start looping through the data and updating the cursor variables with data from this cursor
FETCH NEXT FROM NewPersonTableImportCursor INTO @FirstNameVariable, @SurnameVariable
WHILE @@FETCH_STATUS=0 --Fetch Status 0 means successfull so only proceed on those rows from source table that were successfull
BEGIN

PRINT @FirstNameVariable;
END
CLOSE NewPersonTableImportCursor

【问题讨论】:

  • 你需要在你的循环中再次调用FETCH NEXT,否则你永远不会真正获取下一个。不过,我对使用光标非常谨慎,在 99% 的情况下,如果它们不是工作的正确工具,通常会有更好的基于集合的方法。如果您必须使用游标,请以最简单的方式声明它,即如果您只是向前移动,则使用FORWARD_ONLY 声明它,如果数据永远不会更改,则使用STATIC 声明它,等等。更多信息在这里 - sqlperformance.com/2012/09/t-sql-queries/cursor-options
  • 你没有从循环内的游标中获取下一个结果
  • @GarethD 在这里提出了一个非常有效的观点。通过痛苦行 (RBAR) 导入数据行将非常非常缓慢。基于集合的解决方案,甚至是“基于集合的光标”(取决于要求)几乎肯定会快得多。
  • 这是一个基于集合的查询示例,用于替换光标和循环,猜测您的最终意图:INSERT INTO dbo.YourTable (Firstname, Surname) SELECT Firstname, Surname FROM dbo.A_NewPersonTable AS new WHERE NOT EXISTS(SELECT Firstname, Surname FROM dbo.YourTable AS existing WHERE existing.Firstname = new.Firstname AND existing.Surname = new.Surname);
  • 谢谢。我的最终目标是拥有一个临时表,其中包含将填充多个表的信息。一个简单的例子 - 临时表可能有 3 列(工作编号、员工、车辆)。临时表有 10 条记录。对于每条记录,它将在 tblJobs 中插入一条新记录,并输入员工 ID。但是如果员工不存在(因为我们只是使用他们的名字),那么它也会在 tblEmployee 上执行插入操作,然后返回闪亮的新员工 ID 以进入 tblJobs。游标会是该场景的最佳用途吗?感谢您的宝贵时间

标签: sql-server tsql database-cursor


【解决方案1】:

在循环结束前添加FETCH NEXT FROM NewPersonTableImportCursor INTO @FirstNameVariable, @SurnameVariable获取下一条记录

【讨论】:

  • 谢谢,这么简单!
猜你喜欢
  • 2011-01-11
  • 1970-01-01
  • 2018-11-20
  • 2018-02-17
  • 2022-01-13
  • 2014-06-02
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多