SQL Server更新集金额=(正数字)和#x2B;(负数)增加金额?为什么?

SQL Server更新集金额=(正数字)和#x2B;(负数)增加金额?为什么?,sql,sql-server-2008-r2,set,numeric,Sql,Sql Server 2008 R2,Set,Numeric,我正在从全局临时表执行更新,如下所示: update some_table set Amount = (##GlobalTable.InitialAmount) + (##GlobalTable.[Difference]) from ##GlobalTable where Amount = ##GlobalTable.InitialAmount Amount、InitialAmount和Difference列都是数字(21,2) 金额和初始金额始终为正。问题是,当差额为负时,产生的金额实际上是

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

update some_table
set Amount = (##GlobalTable.InitialAmount) + (##GlobalTable.[Difference])
from ##GlobalTable
where Amount = ##GlobalTable.InitialAmount
Amount、InitialAmount和Difference列都是数字(21,2)

金额和初始金额始终为正。问题是,当差额为负时,产生的金额实际上是由负差额增加的。它应该执行减法,但不是。当差值为正值时,它工作正常。知道为什么会这样吗

我使用的是64位Windows 7 Enterprise SP1,使用的是SQL Server 2008 R2,这种情况可能会发生…(但可能不是您看到的情况)

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

如果是这样的话,那么某些#表中的一行可能与##GlobalTable中的两行(或更多行)匹配,SQLServer无法保证您将得到什么答案

根据我的经验,SQLServer将选择一行用于更新,它通常是根据执行计划从##GlobalTable检索到的最后一行。由于执行计划会随着表内容的变化而变化,因此结果不太可预测,在编写代码时也不值得依赖


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

请提供演示此问题的
某些#表
GlobalTable
的示例数据。顺便说一句,
更新。。。如果
##GlobalTable
中的多个可能行与
some_表中的行匹配,则FROM
语法可能会导致不确定的结果。另外,为什么要使用全局##temp表?您是否有意终止并发而不是使用本地临时表?