sql-server - 是否可以在sql中的同一条语句中读取和分配变量?

标签 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 文档,但找不到任何相关信息。

最佳答案

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/

相关文章:

sql-server - 删除基于日期的时间线内出现的连续重复值

sql-server - while循环在触发器内循环遍历sql中表的所有列

SQL Server 动态排序依据

sql-server - sql中的动态查询以及如何在view中实现

sql-server - T-SQL 错误 : Adding a value to a 'smalldatetime' column caused overflow. SQL 服务器错误?

sql - 如何获取SQL子串?

.net - SqlConnection.Dispose() 是否对所有挂起的事务执行回滚?

SQL Server - 如何获取用户登录映射?

sql - 在 SQL Server 中迭代字符串列表?

sql-server - T-SQL-行模式中 N' 的含义 (xpath)