是什么使我的SQL更新脚本在不同的服务器上表现不同

是什么使我的SQL更新脚本在不同的服务器上表现不同,sql,sql-server,sql-update,Sql,Sql Server,Sql Update,我正在将数据库从一台服务器迁移到另一台服务器。在验证某些报告时,我发现了由于以下更新脚本导致的差异: UPDATE #t SET OtherValueID = t4.OtherValueID FROM #t t INNER JOIN #t4 t4 ON t.ValueID = t4.ValueID WHERE t.OtherValueID IS NULL 因此,在服务器1上,该脚本将ValueID 1的OtherValueID设置为123。在服务器2

我正在将数据库从一台服务器迁移到另一台服务器。在验证某些报告时,我发现了由于以下更新脚本导致的差异:

UPDATE
    #t
SET
    OtherValueID = t4.OtherValueID 
FROM
    #t t
    INNER JOIN #t4 t4 ON t.ValueID = t4.ValueID 
WHERE
    t.OtherValueID IS NULL
因此,在服务器1上,该脚本将ValueID 1的OtherValueID设置为123。在服务器2上,此脚本将ValueID 1的OtherValueID设置为456

我知道问题在于#t4包含ValueID=1的重复OtherValueID,应该更改此脚本。但是,我想知道的是,这两台服务器的不同之处是什么,这两台服务器的更新性能会有所不同?我可以理解它是否只是“随机的”,但事实并非如此,因为服务器1每次都返回相同的值,服务器2也返回相同的值


服务器版本相同。我对redgate SQL进行了比较,以确认两台服务器上的模式完全相同。是否还有其他因素会影响到这一点,或者可能性是如此无限或不可能访问,以至于我应该停止尝试?

必须是数据的差异,而不是模式的差异。连接必须在不同的行上匹配,或者行在OtherValueID.Ohh中具有不同的值,而且既然您说您有重复项,那么您肯定会因此得到不同的结果。发生的情况是,引擎将使用重复列表中的“last”值。由于您无法控制连接将在多个连接中的哪一个上匹配,因此新服务器完全有可能以不同的顺序返回。您需要进一步的标准来确定(可预测的)将使用哪个匹配行。否则,SQL Server的选择是任意的/不确定的。忘记两个不同的服务器,你可以在同一台服务器上得到不同的答案。首先,两台服务器上的#t和#t4以相同的顺序包含完全相同的数据。其次(@Aaron),我可以在每台服务器上运行任意次数的脚本,得到完全相同的结果。这两台服务器之间的结果恰好不同。根据定义,表是一个无序的行包。它不是“以相同的顺序包含”的。而且,我说过你可以在同一台服务器上得到不同的结果。可能不是今天,但可能是下周,或者下个月,或者在一个service pack之后,或者在重新启动SQL Server之后,等等。同样地,表是一组无序的行。如果总是希望更新某一行,请以明确的方式标识该行。请看一看。