【问题标题】:How does chaining variable assignments work in SQL?链接变量赋值如何在 SQL 中工作?
【发布时间】:2011-04-22 16:09:44
【问题描述】:

我正在分析存储过程中的一些旧 SQL 代码。

Declare @Var1 money, 
    @Var2 money, 
    @Var3 money, 

等等……

Select @Var1 = OldValue, 
       @Var2 = @Var1, 

等等……

所以我想知道当它们都在同一个 select 语句中时这些赋值是如何工作的。我假设调用 select 后 Var2 = OldValue,但我想确定一下。

围绕这种情况的规则是什么?分配是否按照声明的顺序执行?如果是这样,在以下情况下将为 Var2 分配什么值:

Select @Var2 = @Var1,
       @Var1 = OldValue,

谢谢!

【问题讨论】:

  • 它目前正在一个稍微简单的存储过程中使用,并且似乎正在工作。所以我想我很确定它按预期运行。不管怎样,在我看来,它只是一种糟糕的风格。

标签: sql sql-server tsql variables


【解决方案1】:
DECLARE @Var1 MONEY = 100, @Var2 MONEY = 50 

SELECT @Var1 = @Var2, 
       @Var2 = @Var1 

SELECT  @Var1, @Var2  

返回

--------------------- ---------------------
50.00                 50.00

所以在那种情况下,他们是按照从左到右的顺序执行的但是这不能依赖!

如果有多个赋值 单个 SELECT 语句中的子句, SQL Server 不保证 评价顺序 表达式。请注意,效果是 仅在有引用时可见 在任务中。

来源http://msdn.microsoft.com/en-us/library/ms187953.aspx

【讨论】:

  • 感谢您的好回答,文档链接真的很棒。
【解决方案2】:

首先在@var2 = @var1 的情况下,我相信var2 是NULL。- 它们将是值类型,因此在后台没有任何引用,就像在.Net 这样的语言中那样

您总是可以通过提取 sql 代码进行测试,将结果放入表变量中,然后从中选择以查看您拥有的内容。

【讨论】:

    【解决方案3】:

    如果您希望@val2 与@val1 具有相同的值,为什么不这样做呢

      Select @Var2 = OldValue,
             @Var1 = OldValue, 
    

    【讨论】:

    • 你会这样做的。它的代码很糟糕,我正在完全替换它。
    • 从问题中指定的伪代码不清楚“OldValue”是什么意思。如果“OldValue”是一些不确定的表达式,那么 HLGEM 的建议可能不会为两个变量分配相同的值。
    猜你喜欢
    • 2010-10-05
    • 2011-11-05
    • 2012-07-23
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多