繁体   English   中英

为什么在这个 SQL While 循环中返回相同的值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM