Why is the same value being return in this SQL While Loop?(为什么在此SQL While循环中返回相同的值?)
本文介绍了为什么在此SQL While循环中返回相同的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用Microsoft SQL Server,并尝试将一些数据插入到临时表中。然后,我希望使用WHILE循环遍历临时表中的每一行。我不想使用光标。
请参见以下查询:
-- Create Table
DROP TABLE IF EXISTS #TMP_ABC
CREATE TABLE #TMP_ABC
(
[ABC] [varchar](3) NULL,
)
-- Insert Values
INSERT INTO [#TMP_ABC] VALUES ('AAA')
INSERT INTO [#TMP_ABC] VALUES ('BBB')
INSERT INTO [#TMP_ABC] VALUES ('CCC')
INSERT INTO [#TMP_ABC] VALUES ('DDD')
INSERT INTO [#TMP_ABC] VALUES ('EEE')
INSERT INTO [#TMP_ABC] VALUES ('FFF')
-- Display values
DECLARE @count INT
DECLARE @row INT
SET @row = 1;
DECLARE @ABC varchar(3)
SET @count = (SELECT COUNT(ABC) FROM #TMP_ABC)
WHILE (@row <= @count) BEGIN
SELECT @ABC = ABC FROM #TMP_ABC
PRINT @ABC
SET @row += 1
END
以下是查询返回的内容:
(1 row affected)
FFF
FFF
FFF
FFF
FFF
FFF
我希望返回以下内容:
(1 row affected)
AAA
BBB
CCC
DDD
EEE
FFF
请有人"好心"向我展示一下我前进道路上的错误,以及如何做到这一点?
推荐答案
发生此问题是因为SQL Server没有将@row与表中的行相关联(这种关联对您来说很明显,但SQL Server不是人)。
1 -> @count时,它会反复运行相同的SELECT @ABC = ABC FROM #TMP_ABC。没有WHERE子句和TOP,因此SQL Server每次都只是读取整个表,并将变量设置为等于它读取的最后ABC值。
相反,您应该使用游标(如果您需要循环;通常不需要,根据@Larnu's comment)。您在某处读到了一些错误信息,认为游标是错误的,而While循环不是游标,但这两者都是错误的。
- Bad Habits to Kick : Thinking a WHILE loop isn't a CURSOR
- What impact can different cursor options have?
- Follow-up on cursor options
- Overlooked T-SQL Gems(请参阅为什么对游标使用局部变量比您可能使用的常规类型更好)
如果您确实出于某种原因需要循环,则重写如下:
CREATE TABLE #TMP_ABC(ABC varchar(3));
INSERT INTO #TMP_ABC(ABC) VALUES
('AAA'),('BBB'),('CCC'),('DDD'),('EEE'),('FFF');
DECLARE @ABC varchar(3), @c cursor;
SET @c = cursor LOCAL FAST_FORWARD
FOR SELECT ABC FROM #TMP_ABC;
OPEN @c;
FETCH NEXT FROM @c INTO @ABC;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @ABC;
FETCH NEXT FROM @c INTO @ABC;
END
输出:
AAA
BBB
CCC
DDD
EEE
FFF
- 示例db<>fiddle
但我不确定这比SELECT ABC FROM #TMP_ABC;完成了什么。
这篇关于为什么在此SQL While循环中返回相同的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:为什么在此SQL While循环中返回相同的值?
基础教程推荐
猜你喜欢
- CHECKSUM 和 CHECKSUM_AGG:算法是什么? 2021-01-01
- 使用 VBS 和注册表来确定安装了哪个版本和 32 位 2021-01-01
- MySQL 5.7参照时间戳生成日期列 2022-01-01
- MySQL根据从其他列分组的值,对两列之间的值进行求和 2022-01-01
- 带有WHERE子句的LAG()函数 2022-01-01
- ORA-01830:日期格式图片在转换整个输入字符串之前结束/选择日期查询的总和 2021-01-01
- 带更新的 sqlite CTE 2022-01-01
- 从字符串 TSQL 中获取数字 2021-01-01
- 如何在 CakePHP 3 中实现 INSERT ON DUPLICATE KEY UPDATE aka upsert? 2021-01-01
- while 在触发器内循环以遍历 sql 中表的所有列 2022-01-01
