寻找特定SQL Server模式的名称

时间:2013-12-13 22:29:29

标签: sql-server sql-server-2008 tsql

我在使用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。

为什么这样做并且这个模式有名字?这是一种反模式吗?

1 个答案:

答案 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项显示。