我在 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 文档,但找不到任何相关信息。
最佳答案
Is it possible to read and assign variable in the same statement?
是的,至少在某些时候是这样。以下按预期工作
DECLARE @number INT = 2147483647
SELECT @number = number
FROM master..spt_values
WHERE number < @number
ORDER BY number
SELECT @number, @@ROWCOUNT
即使在第一行被处理后 -32768
被分配给变量 WHERE
子句显然仍然使用 2147483647
的初始值而不是新值 - 因为 @@ROWCOUNT
显示它处理了整个表并且 @number
以最终赋值的结果结束。
所以在这种情况下,变量的初始值被视为 runtime constant并且不受任务的影响。我怀疑这种行为是否得到保证。一般跨多行变量赋值的效果是无法保证的。
我还尝试了以下方法以确保正在评估变量 RBAR 并且结果仍然与上面相同。
CREATE FUNCTION [dbo].[F](@I1 INT,@I2 INT)
RETURNS INT
AS
BEGIN
RETURN @I1
END
GO
DECLARE @number INT = 2147483647
SELECT @number = number
FROM master..spt_values
WHERE number < [dbo].[F](@number, number)
ORDER BY number
SELECT @number, @@ROWCOUNT
关于sql-server - 是否可以在sql中的同一条语句中读取和分配变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41908787/