sql必须声明标量变量

时间:2018-06-25 15:35:59

标签: sql sql-server

这是一个非常简单的问题,但是我在此站点的任何地方都找不到答案。我正在尝试使for循环在SQL中转到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语句中发生错误

2 个答案:

答案 0 :(得分:5)

设置变量的值时,需要使用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;

但是,这里更好的问题是:为什么要使用WHILE循环?当使用数据集方法的99/100倍时,它们在SQL Server中非常难以打开可以实现。

要证明这确实有效:

CREATE TABLE #ACTIVES (i int);

WITH i AS(
     SELECT 1 AS n
     UNION ALL
     SELECT n + 1
     FROM i
     WHERE n +1 <= 30)
INSERT INTO #ACTIVES
SELECT n
FROM i;
GO

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;
    PRINT 'Loop ' + CONVERT(varchar(2),@Count);
END;

GO
DROP TABLE #ACTIVES;
GO

这将输出以下内容:

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

答案 1 :(得分:0)

您还可以使用递归方式:

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);