【问题标题】:SQL Server update set amount = (positive numeric) + (negative numeric) increases amount? Why?SQL Server更新设置量=(正数)+(负数)增加量?为什么?
【发布时间】:2012-07-20 04:35:29
【问题描述】:

我正在从全局临时表执行更新,如下所示:

update some_table
set Amount = (##GlobalTable.InitialAmount) + (##GlobalTable.[Difference])
from ##GlobalTable
where Amount = ##GlobalTable.InitialAmount

Amount、InitialAmount 和 Difference 列都是 numeric(21,2)

Amount 和 InitialAmount 始终为正数。问题是,当差异为负时,产生的金额实际上会因负差异而增加。它应该执行减法,但事实并非如此。当差异为正时,它工作正常。任何想法为什么会发生这种情况?

我在使用 SQL Server 2008 R2 的 Windows 7 Enterprise SP1 64 位上

【问题讨论】:

  • 请提供some_table##GlobalTable 的示例数据以证明该问题。顺便说一句,如果##GlobalTable 中多个可能的行与some_table 中的行匹配,UPDATE ... FROM 语法可能会导致不确定的结果
  • “当差异为负时”是什么意思?
  • 顺便说一句,您为什么要使用全局##temp 表?您是否故意杀死并发而不是使用本地 #temp 表?

标签: sql sql-server-2008-r2 set numeric


【解决方案1】:

这可能发生的一种方式...(但可能不是您所看到的)

查看##GlobalTable 中是否有两行的 InitialAmount 值相同,但 Difference 的值不同。

如果是这样,那么 some_table 中的一行可能会匹配 ##GlobalTable 中的两个(或多个)行,并且 SQLServer 不保证您会得到什么答案。

根据我的经验,SQLServer 将在更新中选择要使用的行,它通常是根据执行计划从 ##GlobalTable 检索到的最后一个符合条件的行。由于执行计划会随着表内容的变化而发生变化,因此结果不是那么可预测的,并且在编写代码时也不能指望。

除非您知道##GlobalTable 中的每一行都有一个唯一的InitialAmount 值,否则您应该选择一种更可靠的方式将some_table 与##GlobalTable 连接起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 2017-04-05
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多