SQL Server更新时间戳列

时间:2011-01-04 10:37:48

标签: sql sql-server

在我的数据库中,我有一个timestamp列。我需要更新表格中的一行,并需要更新timestamp列。当我运行更新命令时,我得到:

Cannot update a timestamp column.

如何更新时间戳列?

5 个答案:

答案 0 :(得分:31)

你没有

timestamp column is updated automatically。也许你的印象是时间戳包含与时间有关的值?它没有,但只是一个数字,只要该记录中的值是更新的数字。 将其视为行版本号

来自MSDN

  

时间戳数据类型只是一个   递增数字而不是   保留日期或时间。

答案 1 :(得分:3)

您不更新timestamp列 - 只要更新了行中的任何其他列,SQL Server就会自动更新时间戳(现在重命名为rowversion)列。


如果您已经知道这一点,但由于某种原因想要强制更新列,只需针对您想要影响的行执行更新。即使它没有导致实际数据更改,时间戳列仍将更新:

create table #T1 (
    ID int not null,
    ts timestamp not null
)
insert into #T1 (ID)
select 1 union all
select 2
select * from #T1
update #T1 set ID = ID where ID=1
select * from #T1

ID  ts
1    0x0000000000039AAF
2    0x0000000000039AB0

ID  ts
1    0x0000000000039AB1
2    0x0000000000039AB0

答案 2 :(得分:2)

虽然我不能回答你的问题但我想提及TIMESTAMP如何被误解。

您没有在问题中声明使用TIMESTAMP列,但事实上,您尝试更新它意味着(对我而言)您尝试记录数据何时更改。

当您真正想要使用TIMESTAMP记录更改时,请查看this article(网上还有很多其他人)关于使用DATETIME

BOL说:

  

SQL Server时间戳数据类型   与时间或日期无关。   SQL Server时间戳是二进制的   表示相对的数字   数据修改的顺序   发生在一个数据库中。该   时间戳数据类型最初   实现支持SQL Server   恢复算法。

正如Damien_The_Unbeliever所说,该类型已重命名,描述如下:

  

rowversion数据类型只是一个   递增数字而不是   保留日期或时间。记录一个   日期或时间,使用datetime2数据   类型。

当然,如果您以预期的方式使用数据类型,请忽略以上所有内容:)

答案 3 :(得分:1)

timestamp列无法更新,因为它是服务器生成的,并且被保证为整个数据库的唯一性 - 如果允许更新,则不是,那么该值不是唯一的。

我在尝试更新复制实例中的timestamp列时遇到同样的问题,因为复制的实例没有与发布者相同的时间戳值 - 这在尝试获取每组记录的最后更新记录时导致了一些问题。当然,通过复制,发布者只需一个简单的配置即可将相同的时间戳值复制到订阅者。

否则,没有其他方法可以更新时间戳值。

答案 4 :(得分:1)

我有同样的问题,我的解决方案:

UPDATE [table]
SET [ANY_COLUMN] = [ANY_COLUMN]
WHERE ID = [ID]

就像表值更改时重新计算时间戳一样,我将任何列更新为相同的值,因此更新时间戳