SQL 2005/8 Quirky 更新“黑魔法”

Posted

技术标签:

【中文标题】SQL 2005/8 Quirky 更新“黑魔法”【英文标题】:SQL 2005/8 Quirky update "black arts" 【发布时间】: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 答案是肯定的。但必须满足某些条件。阅读文章。 【参考方案1】:

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

【讨论】:

很酷的文章...从未听说过“万圣节保护”。 投反对票,因为答案是错误的。另外两个答案指向了 Jeff Moden 的解决方案,我已经实施并且可以保证。 @AnthonyK:其他人实施了糟糕的建议并为此作了担保,然后是they got burned。

以上是关于SQL 2005/8 Quirky 更新“黑魔法”的主要内容,如果未能解决你的问题,请参考以下文章

揭秘Presto+Alluxio 的N个核心“黑魔法“

Python都有哪些黑魔法?

Swift3.0 - 黑魔法swizzle

python 黑魔法收集

黑魔法来了,不要眨眼

meta.Vectors 背后的黑魔法是啥?