我在使用SQL时遇到了麻烦,我偶然发现这个代码很偶然,原因是我至少在SQL Server 2008中无法解释这些代码。
我通常不会问这个问题,但我不应该寻找什么,我希望能找到答案。
DECLARE @Number INT = 1
SELECT @Number = @Number + N
FROM (SELECT * FROM (VALUES (2), (3), (4)) vals(N)) vals
PRINT @Number
这会增加1 + 2 + 3 + 4并产生10。
为什么这样做并且这个模式有名字?这是一种反模式吗?
答案 0 :(得分:2)
是的,这是反模式。
无法保证工作(see recent Connect item)并且会抑制并行性。只需使用SUM
。
DECLARE @Number INT = 1
SELECT @Number+= SUM(N)
FROM (SELECT * FROM (VALUES (2), (3), (4)) vals(N)) vals
PRINT @Number
它类似于另一种用于连接also not guaranteed字符串的旧技术。
为什么这样做
当它正常工作时,对于源中的每一行,变量增加N
。但是,这是依赖于执行计划,因为链接的Connect项显示。