[英]Why is the same value being return in this SQL While Loop?
我正在使用 Microsoft SQL 服务器,并尝试将一些数据插入到临时表中。 然后我想使用一个while循环来遍历临时表中的每一行。 我不想使用 cursor。
请看下面的查询:
-- 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 服务器没有将@row
与表中的行关联(相关性对您来说很明显,但 SQL 服务器不是人类)。
当您遍历数字1 -> @count
时,它一遍又一遍地运行相同的SELECT @ABC = ABC FROM #TMP_ABC
。 没有WHERE
子句也没有TOP
所以 SQL 服务器每次只是读取整个表,并将变量设置为它读取的最后一个ABC
值。
相反,您应该使用 cursor (如果您需要循环;根据@Larnu 的评论,通常不需要)。 您已经在某处阅读了一些错误信息,即游标不好并且 while 循环不是游标,但这些都是错误的。
如果您确实出于某种原因确实需要循环,这里是一个重写:
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
Output:
AAA
BBB
CCC
DDD
EEE
FFF
但我不确定SELECT ABC FROM #TMP_ABC;
.
使用 ROW_NUMBER() function 并通过循环中 WHERE 子句中的变量传递值。
--Create another Temp table
CREATE table #Tem_abc (r int , abc varchar(3));
--Add Row number
insert into #Tem_abc
select ROW_NUMBER() over( order by ABC) as r,*
from #TMP_ABC;
--Use the loop
DECLARE @count INT;
DECLARE @row INT;
SET @row = 1;
DECLARE @ABC varchar(3);
SET @count = (SELECT COUNT(ABC) FROM #TMP_ABC);
--SET @count = (SELECT max(r) FROM #Tem_abc);
WHILE (@row <= @count) BEGIN
SELECT @ABC = ABC FROM #Tem_abc where @row = r;
PRINT @ABC;
SET @row += 1;
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.