【问题标题】:SQL 2000: Variables in update statements and order of evaluationSQL 2000:更新语句中的变量和评估顺序
【发布时间】:2010-09-01 04:54:11
【问题描述】:

我有一个 update 声明,格式如下:

declare @v as int
update tbl
set @v=tbl.a=(select sum(amount) from anothertable at where at.x = tbl.y),
    tbl.b = @v/2

我想使用变量的原因是避免使用子查询两次。问题是我没有找到任何说明这是安全的参考资料。第二个赋值(即 tbl.b = @v/2)总是在第一个赋值之后进行评估吗?

select 语句的评估顺序无法保证。更新语句也是如此吗?

非常感谢。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以通过以下方式摆脱对评估顺序的担忧:

    UPDATE tbl
    SET tbl.a = s.theSum,
        tbl.b = s.theSum / 2
    FROM tbl
    INNER JOIN (
        SELECT x, SUM(amount) AS thesum
        FROM anothertable
        GROUP BY x
    ) s ON s.x = tbl.y
    

    【讨论】:

      【解决方案2】:

      SQL 是一种声明性语言。不要尝试在其中进行命令式构造。这不是C。 任何语句(SELECT、DELETE、UPDATE、MERGE、INSERT、really、any)都不保证求值顺序。

      【讨论】:

      • Microsoft 清楚地说明了“选择”语句,但没有说明更新语句。你有关于更新声明的任何文档参考吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-10
      • 2019-02-06
      • 2013-04-10
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多