是否可以在tsql中的同一语句中读取和赋值变量?

时间:2017-01-28 10:37:44

标签: sql-server tsql

我在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文档,但找不到任何相关内容。

2 个答案:

答案 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;

它开始正常工作。