Upsert选项:rowversion与datetime

时间:2018-08-21 12:13:50

标签: sql-server tsql clone upsert rowversion

很多时候,我需要将一个大表的数据(称为源)移动到它的克隆(称为目标)。由于尺寸较大,我宁愿重新插入而不是全部删除/插入。

为简便起见,我们假设一个名为“ id”的int PK col。

直到现在,为了执行此操作,我使用了两个表中都存在的datetime字段dbupddate,该字段保存了最近一次插入/更新行的时间。这是通过使用触发器完成的,该触发器对于任何插入/更新,都将dbupddate设置为getdate()。

因此,到目前为止,我的常规代码看起来像:

update t set (col1=s.col1,col2=s.col2 etc)
from source s
inner join target t on s.id=t.id and s.dbupddate>t.dbupddate

insert target 
select * from source s
where not exists (select 1 from target t where t.id=s.id)

最近我偶然发现了rowversion。我已经阅读并在某种程度上了解了它的功能,但是我想从实践中知道如果将dbupddate更改为rowversion而不是datetime会有什么好处/缺点。

1 个答案:

答案 0 :(得分:0)

尽管datetime包含在某些情况下可能有用的信息,但由于系统datetime始终有被更改和失去准确性的风险,因此rowversion更为可靠。 就您而言,我个人更喜欢rowversion的可靠性。