Sql server SQL Server:必须声明标量变量

Sql server SQL Server:必须声明标量变量,sql-server,Sql Server,我正在开发SQL Server 2012。我尝试声明两个变量@max和@rc,并在insert语句中使用它们: DECLARE @max INT SET @max = 100000 DECLARE @rc INT SET @rc = 1 INSERT INTO dbo.Nums VALUES(1); WHILE @rc * 2 <= @max BEGIN INSERT INTO dbo.Nums SELECT n + @rc FROM dbo

我正在开发SQL Server 2012。我尝试声明两个变量@max和@rc,并在insert语句中使用它们:

DECLARE @max INT 
SET @max = 100000

DECLARE @rc INT
SET @rc = 1

INSERT INTO dbo.Nums VALUES(1);

WHILE @rc * 2 <= @max
BEGIN
    INSERT INTO dbo.Nums 
       SELECT n + @rc 
       FROM dbo.Nums

    SET @rc = @rc * 2
END

INSERT INTO dbo.Nums 
   SELECT n + @rc 
   FROM dbo.Nums 
   WHERE n + @rc <= @max
GO
我四次遇到这个错误:

[错误代码:137,SQL状态:37000] [Microsoft][ODBC SQL Server驱动程序][SQL Server] 必须声明标量变量@rc

当我尝试以下方法时:

DECLARE @max INT
SET @max = 100000

DECLARE @rc INT
SET @rc = 1

INSERT INTO dbo.Nums VALUES(1);

WHILE @rc * 2 <= @max
BEGIN
    DECLARE @rc     INT
    DECLARE @max    INT

    SET @max = 100000

    INSERT INTO dbo.Nums 
       SELECT n + @rc 
       FROM dbo.Nums

    SET @rc = @rc * 2
END

INSERT INTO dbo.Nums 
   SELECT n + @rc 
   FROM dbo.Nums 
   WHERE n + @rc <= @max
GO
我只得到一次:

[错误代码:137,SQL状态:37000] [Microsoft][ODBC SQL Server驱动程序][SQL Server] 必须声明标量变量@rc

你能帮我解决这个问题吗


谢谢

因为这看起来像是您在尝试填充数字表,这里是另一种方法。它不使用循环,而且相当简单

DECLARE @max INT;
SET @max = 100000;

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    E5(N) as (select 1 from E4, E1),
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E5
    )

INSERT INTO dbo.Nums 
select N from cteTally
where N <= @max;

您是否选择了要运行的所有SQL行?它对我来说运行得很好,我认为您在执行时没有选择声明变量的行。谢谢您的回复。我使用DbVisualizer来运行该命令。它不允许选择行,我将整个代码放在这里并简单地执行它。这一定是DbVisualizer的一个怪癖/问题。在SSMS中工作良好;SQL没有问题。什么版本的@TabAlleman。在2008r2中,它会抱怨,因为变量是在循环中声明的。删除分号修复了这个问题?您的客户端工具严重损坏。查看是否有允许您指定批处理分隔符的设置-似乎默认为分号,但我认为您应该使其与本机工具保持一致。谢谢,这很有帮助