【问题标题】:T-SQL: can't seem to set variables immediately after declaring themT-SQL:声明变量后似乎无法立即设置变量
【发布时间】:2018-11-16 02:23:05
【问题描述】:

我浏览了无数关于在 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 语句设置值,以及单独声明每个变量,并在同一语句中声明和设置值但无济于事。

【问题讨论】:

  • 尝试在 WHILE 之前执行初始的 DECLARE 和 SET 部分。就这样运行成功了吗?
  • 您的代码的第一部分工作得很好,似乎错误来自您的问题中未提供的其余代码中的一行。
  • 我猜这可以在不使用循环的情况下重写。它不仅可以解决您的变量问题,而且维护起来会更快、更容易。
  • SQL Server 的哪个版本?
  • 同意@Sami 在我的桌子上尝试了你的代码,它工作得很好。您的打印被注释掉的地方。只需打印两个或所有变量并查看它们的值。

标签: sql sql-server tsql


【解决方案1】:

以上内容确实有效(我的意思当然是在没有 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 会抛出你的错误。

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 2023-03-11
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多