T-SQL:声明变量后似乎无法立即设置变量

时间:2018-11-15 17:21:14

标签: sql sql-server tsql

我浏览了无数有关在sql脚本中声明/设置变量的文章。但大多数似乎涉及语法错误或使用exec命令。我尝试执行的脚本非常简单-因此我很难理解为什么我不能设置值。

这是SQL:

declare @counter int = 1,
        @batchSize int = 100000,
        @tableRows int,
        @totalBatches int;

set @tableRows= (select count(distinct chFileVersionID) from IRISDocuments)
set @totalBatches = (ceiling((@tableRows / @batchSize)));

--print some stuff

while @counter <= @totalBatches
begin
 . . . loop logic that only uses @counter variable for incrementing 
end

我得到的错误是

  

必须声明标量变量“ @tableRows”

在上面直接声明。我尝试使用select语句设置值,以及分别声明每个变量,并在同一语句中声明和设置值无济于事。

1 个答案:

答案 0 :(得分:0)

上面的方法实际上有效(我的意思是在没有WHILE循环的情况下进行测试)。

2个错误的可能来源,如果变量没有如上使用:

  1. 使用变量在同一声明中定义另一个变量

例如:

declare @counter int = 1,
        @batchSize int = 100000,
        @tableRows int = 10000000000000,
        @totalBatches int = (ceiling((@tableRows / @batchSize)))

这将不起作用并产生错误-语句中的执行顺序不是逐行的,因此您无法为@totalBatches赋值,因为此时尚未实现@tableRows。

  1. 尝试使用超出范围的变量
    如果这是一个包含GO批处理分隔符的查询,则此后,GO之前的所有变量都超出范围。

例如:

declare @counter int = 1,
        @batchSize int = 100000,
        @tableRows int,
        @totalBatches int;

SELECT @counter, @batchSize, @tableRows, @totalBatches int
GO


SELECT @counter, @batchSize, @tableRows, @totalBatches int

第二个SELECT会抛出错误。