gpt4 book ai didi

sql - SELECT 为局部变量赋值并再次引用它。 SQL Server 保证结果吗?

转载 作者:行者123 更新时间:2023-12-01 11:18:44 26 4
gpt4 key购买 nike

SELECT 将值赋给@v1 并在同一语句中使用@v1 计算@v2。结果是@v1 = 100 和@v2=105。

这些结果总是由 SQL Server 保证吗? SQL Server 是否保证在引用@v1 计算@v2 时,@v1 = 100 的所有副作用都已完成并且SQL Server 确实在所有副作用完成后读取了@v1?

SQL Server 可能给出不同结果的极端情况?

declare
@v1 int,
@v2 int

-- Let's keep the order of assignment as it is listed here.
select
@v1 = 100,
@v2 = @v1 + 5

select
@v1 as '@v1',
@v2 as '@v2'

我查了一下MSDN , 但找到任何关于这个的东西。

最佳答案

Here您可以找到一个很好的演示,它表明 SELECT 后面的表达式的求值顺序永远得不到保证。我想 SQL Server 总是会线性评估这种简单的语句。但是,如果你有以下语句

declare
@v1 int = 0,
@v2 int = 0

select
@v1 = 100,
@v2 = (SELECT @v1 + 5)

select
@v1 as '@v1',
@v2 as '@v2'

那么结果就是

@v1  @v2
100 5

这就是为什么在 SELECT 而不是 SET 中为变量赋值被认为是 bad habbit 的原因.

编辑:

如讨论中所述,除了首先运行子查询之外,没有其他方法可以评估我的查询。因此,表达式评估的顺序不再是优化器选择的问题。另一方面,主要信息保持不变。不能保证表达式求值的顺序,我们不应在 SQL 代码中依赖它。

关于sql - SELECT 为局部变量赋值并再次引用它。 SQL Server 保证结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46796641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com