【问题标题】:SQL 2005/8 Quirky update "black arts"SQL 2005/8 Quirky 更新“黑魔法”
【发布时间】:2010-11-02 21:59:11
【问题描述】:

大家好,所有 SQL Server Blackbelt 大师。

我有一个简单的问题需要解决。我正在尝试在桌子上做一些古怪的更新。表的具体结构并不重要,我的问题基本上可以归结为以下问题:

update SalesTotal
set @total = total = @total + sales,
@flag = flag = case when @flag = 1 then 0 
                    when @total > x then 1
                    else 0 end

问题是我可以相信@total 变量会有一个新值,即。将在第二个集合部分之前执行,或者它将包含一个“旧”值(来自先前的分配),或者它是未定义的。我正在研究这个问题一段时间,但找不到解决方案,这对我的更新非常重要(我想一次性更新一张表)。我要更新的值之一取决于另一个值(在同一行中),因此它在单个更新中工作的唯一方法是它是否有效。

希望你能帮助我

【问题讨论】:

  • 能否提供更新前后的表格和变量?
  • 上面回答的 Jeff Moden 写了我见过的关于这个主题的最好的文章。 sqlservercentral.com/articles/T-SQL/68467 答案是肯定的。但必须满足某些条件。阅读文章。

标签: sql sql-server tsql sql-update


【解决方案1】:

不,您不能对命令的执行顺序做出任何假设。绝对不能保证表中更新的顺序,绝对不能保证@variable 为每个表 SET 更新一次,并且更新很可能使用Halloween protection 的假脱机步骤运行。

【讨论】:

  • 很酷的文章...从未听说过“万圣节保护”。
  • 投反对票,因为答案是错误的。另外两个答案指向了 Jeff Moden 的解决方案,我已经实施并且可以保证。
  • @AnthonyK:其他人实施了糟糕的建议并为此作了担保,然后是they got burned
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多