sql必须声明标量变量

sql必须声明标量变量,sql,sql-server,Sql,Sql Server,这是一个非常简单的问题,但我在这个网站上找不到答案。我试图在SQL中获得一个for循环,使其变为30,但我必须声明标量变量@count。每次我试着运行这个 我的代码如下所示: DECLARE @count INT = 0; DECLARE @total_count INT; SELECT @total_count = COUNT (1) FROM #ACTIVES WHILE @count < @total_count begin --test statement

这是一个非常简单的问题,但我在这个网站上找不到答案。我试图在SQL中获得一个for循环,使其变为30,但我必须声明标量变量@count。每次我试着运行这个

我的代码如下所示:

DECLARE @count INT = 0;
DECLARE @total_count INT;
SELECT @total_count = COUNT (1)
FROM #ACTIVES

WHILE @count < @total_count
begin
        --test statement
        @count = @count + 1
end
go
我做错了什么? while语句出错

设置变量值时需要使用SET。因此:

DECLARE @count int = 0;
DECLARE @total_count int;
SELECT @total_count = COUNT(1)
FROM #ACTIVES;

WHILE @count < @total_count
BEGIN
    --test statement
    SET @count = @count + 1;
END;
这将产生以下结果:

Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
Loop 7
Loop 8
Loop 9
Loop 10
Loop 11
Loop 12
Loop 13
Loop 14
Loop 15
Loop 16
Loop 17
Loop 18
Loop 19
Loop 20
Loop 21
Loop 22
Loop 23
Loop 24
Loop 25
Loop 26
Loop 27
Loop 28
Loop 29
Loop 30
您也可以使用递归方式:


要使示例可执行,请添加ACTIVES的定义。但通常情况下,在该行的@Count之前缺少SET或SELECT。您应该在while循环中添加SET或SELECT以影响变量。如果在SELECT语句中设置了活动,则SET仍然无法使代码正常工作。这肯定是xy问题。我非常怀疑这是你做任何事情的方式。循环的效率非常低。使用基于集合的方法要好得多。我已经尝试过了,它仍然会给我错误1[代码:137,SQL状态:S1000]必须声明标量变量@count。2[代码:137,SQL状态:S1000]必须声明标量变量@count。我试图在ACTIVES中循环列,这就是我使用while循环的原因。是否有更好的sql语句可供使用?@T.Fogarty上述语句确实有效,我添加了一个数据示例。关于一个更好的说法,如果不知道你的实际目标,我无法回答这个问题。谢谢你的帮助,很抱歉质疑它是否有效。我很确定我的机器有问题,因为代码又出现了错误。我的最终目标是循环遍历一列活动,并使用列中每一行的数据。我假设原始帖子中的SQL完全是SSMS中SQL的复制和粘贴,并且在示例中的最后一行之前没有任何GO。SET@total\u count=count1 from actives将不起作用。引用数据集时需要使用“选择”。@Larnu。是的,我错过了。
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
Loop 7
Loop 8
Loop 9
Loop 10
Loop 11
Loop 12
Loop 13
Loop 14
Loop 15
Loop 16
Loop 17
Loop 18
Loop 19
Loop 20
Loop 21
Loop 22
Loop 23
Loop 24
Loop 25
Loop 26
Loop 27
Loop 28
Loop 29
Loop 30
DECLARE @total_count int
SELECT @total_count = count(1) from #ACTIVES

with t as (
     select 1 as cnt
     union all
     select cnt + 1
     from t
     where cnt < @total_count
)

select *
from t
option (maxrecursion 0);