SQL Server正在更新时间戳列

SQL Server正在更新时间戳列,sql,sql-server,Sql,Sql Server,在我的数据库中,我有一个时间戳列。我需要更新表中的一行,并需要更新timestamp列。当我运行更新命令时,我得到: Cannot update a timestamp column. 如何更新时间戳列?您没有更新时间戳列 这个。也许您的印象是时间戳包含一个与时间相关的值?它不是,只是一个数字,只要记录中的值被删除,它就会被更新将其视为行版本号 发件人: 时间戳数据类型只是一个 递增数字,但不递增 保留日期或时间 您不更新timestamp列—只要行中的任何其他列被更新,SQL server就

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

Cannot update a timestamp column.

如何更新时间戳列?

您没有更新时间戳列

这个。也许您的印象是时间戳包含一个与时间相关的值?它不是,只是一个数字,只要记录中的值被删除,它就会被更新将其视为行版本号

发件人:

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


您不更新timestamp列—只要行中的任何其他列被更新,SQL server就会自动更新timestamp(现在已重命名)列


如果您已经知道这一点,但出于某种原因希望强制更新列,那么只需对您希望受影响的行执行更新即可。即使不会导致实际数据更改,时间戳列仍将更新:

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

虽然我的问题不能回答你的问题,但我想提一下时间戳是如何被误解的

您没有在问题中说明您使用的
时间戳
列,但事实上您正在尝试更新它,这意味着(对我来说)您正在尝试记录数据更改的时间

当您实际想要使用
DATETIME
记录更改时,请查看(网络上还有许多其他网站)关于使用
时间戳的信息

波尔说:

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

正如Damien_的异教徒所说,该类型已被重命名,描述中说:

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


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

时间戳列无法更新,因为它是服务器生成的,并且对于整个数据库来说是唯一的-如果允许更新,而不允许更新,则该值不是唯一的

我在尝试更新已复制实例中的时间戳列时遇到了相同的问题,因为已复制实例的时间戳值与发布服务器的时间戳值不同,这在尝试获取每组记录的最后更新记录时导致了一些问题。当然,对于复制,在发布服务器上只需进行简单的配置,即可将相同的时间戳值复制到订阅服务器上


否则,就没有其他方法来更新时间戳值

我也遇到了同样的问题,我的解决方案是:

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

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

不可能将日期和时间存储在时间戳列中,因此无需谨慎。我认为这个答案有误导性。@m.edmondson:你是对的,我的答案的措辞有点误导。我并不是在推断Sally试图在时间戳列中输入datetime值,只是有时候人们会误以为时间戳会自动记录编辑时的时间点,然后试图从数据中提取datetime结果。@JacquesBosch-我同意这是非常误导人的