【发布时间】: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