如何解决T-SQL游标缺少第一个值并分批执行
说我想遍历表xval中定义为的值:
CREATE TABLE xval (x INT NULL);
INSERT INTO xval(x)
VALUES (13),(1),(42),(9),(-2),(14);
GO
现在我有以下内容:
DECLARE @x INT
DECLARE pointer CURSOR FOR (SELECT x FROM xval)
OPEN pointer
FETCH NEXT FROM pointer INTO @x
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @x
FETCH NEXT FROM pointer
END
CLOSE pointer
DEALLOCATE pointer
运行此命令时,SSMS在结果窗口中给我多个批次,并且在每个批次中,它从xval表中选择一个值。但是这些批次仅包含值1,42,9,-2,14 ,最后有一个空批次。 但是,在消息窗口中,我得到以下信息:
13
(1 row affected)
13
(1 row affected)
13
(1 row affected)
13
(1 row affected)
13
(1 row affected)
13
(0 rows affected)
Completion time: 2020-08-30T21:54:14.7480477+01:00
我想知道怎么回事:1.为什么第一批中我没有得到13? 2.为什么首先要批量处理? 3.为什么我的消息中只有13个...
解决方法
我意识到我需要始终获取我声明的变量。
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @x
FETCH NEXT FROM pointer **INTO @x**
END
由于我没有在循环中将值提取到@x中,因此它将继续打印出最初设置为13的@x(第4行上的FETCH NEXT FROM pointer INTO @x
)。因此,每次我们在其周围循环时,它都会打印13。它还会从xval获取下一个值,因此结果窗口将显示其正在获取的内容。由于它已经将13提取到x中,因此指针移至下一个值。因此,您不会在结果窗口中看到13。
最后一个空集是因为即使列表已耗尽,在while循环检查开始之前(@@ FETCH_STATUS = 0)之前,它仍继续从游标中获取下一个值。这就是为什么它为空的原因,因为它试图寻找下一个值,但那里没有任何值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。