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 更新“黑魔法”的主要内容,如果未能解决你的问题,请参考以下文章