我在SQL Server上使用TSQL。 是否可以编写一个语句,在该语句中同时读取和更新临时变量? 例如。 (假设定义了@ var1和var2)
select top 1 @var1 = field1, @var2 = field2 from table1 where field1 > @var1;
或者它应该分成:
select top 1 @var1 = field1, @var2 = field2 from table1 where field1 > @current_var1;
set current_var1 = @var1;
前一种解决方案是否会产生任何并发问题?更一般地说,有什么问题吗?我查看了MSDN文档,但找不到任何相关内容。
答案 0 :(得分:2)
是否可以在同一语句中读取和赋值变量?
是的,至少在某些时候至少这是真的。以下按预期工作
DECLARE @number INT = 2147483647
SELECT @number = number
FROM master..spt_values
WHERE number < @number
ORDER BY number
SELECT @number, @@ROWCOUNT
即使处理完第一行后-32768
已分配给变量,WHERE
子句显然仍然使用2147483647
的初始值而不是新值 - 作为{{ 1}}表示它处理了整个表格,@@ROWCOUNT
最终得到了最终分配的结果。
因此,在这种情况下,变量的初始值被视为runtime constant,并且不受赋值的影响。我怀疑这种行为是否得到保证。通常,不保证跨多行的变量赋值的效果。
我还尝试了以下操作来确保变量被评估为RBAR并且仍然与上面的结果相同。
@number
答案 1 :(得分:0)
在我正在研究的具体案例中,将语句select top 1 @var1 = field1, @var2 = field2 from table1 where field1 > @var1;
分成两行,如
@currvar1 = @var1
select top 1 @var1 = field1, @var2 = field2 from table1 where field1 > @currvar1;
问题消失了,程序开始像魅力一样起作用。 值得一提的是,在我正在研究的案例中,声明被放置在这样的while循环中:
select @maxvar1 = max(field1) from table1
while @var1 < @maxvar1
select top 1 @var1 = field1, @var2 = field2 from table1 where field1 > @var1;
我认为while循环可以在将其更改为
之后以任何方式影响行为select @maxvar1 = max(field1) from table1
while @var1 < @maxvar1
@currvar1 = @var1
select top 1 @var1 = field1, @var2 = field2 from table1 where field1 > @currvar1;
它开始正常工作。