如何插入指定RowVersion值并保留Timestamp列类型?
解决Timestamp列插入旧值的可行方案
首先明确:SQL Server的TIMESTAMP(官方现已推荐用ROWVERSION命名)是系统自动维护的二进制列,不允许用户手动插入或修改值,这是它的固有特性。所以直接插入指定RowVersion值同时保留该列类型,是做不到的。以下是两种符合实际需求的变通方向:
方向一:接受重新生成RowVersion(优先推荐)
如果评估后重新生成版本号的影响极小或无,直接插入数据即可,系统会自动为新行生成RowVersion值,无需手动指定该列:
INSERT INTO Test (Id) VALUES ('d261ff28-6279-4e81-93f4-825c9ca689bd');
这是最贴合Timestamp设计逻辑的方案,操作最简单。
方向二:保留原始RowVersion值,修改列类型为VARBINARY(8)
Timestamp本质就是VARBINARY(8)类型,只是由系统自动生成值。如果业务必须保留旧的版本号,可以将列永久改为VARBINARY(8),之后手动维护版本号:
- 先删除原RowVersion列的相关约束(若存在)
- 通过新增列过渡的方式修改类型(直接ALTER COLUMN Timestamp列会报错):
-- 新增临时列存储旧值(如果表已有数据) ALTER TABLE Test ADD TempRowVersion VARBINARY(8); UPDATE Test SET TempRowVersion = RowVersion; -- 删除原Timestamp列 ALTER TABLE Test DROP COLUMN RowVersion; -- 重命名临时列为原列名 EXEC sp_rename 'Test.TempRowVersion', 'RowVersion', 'COLUMN';
- 插入带旧RowVersion值的数据:
INSERT INTO Test (Id, RowVersion) VALUES ('d261ff28-6279-4e81-93f4-825c9ca689bd', 0x000000000000CF0A);
如果之后需要类似Timestamp的自动更新功能,可以通过触发器实现:当插入或更新行时,自动生成新的VARBINARY(8)值(比如基于自增序列或时间戳生成)。
另外,你之前尝试的「修改列类型→插入→改回Timestamp」不可行,原因有两点:一是SQL Server不允许直接修改Timestamp列的类型;二是即便能改回,系统会自动为所有行重新生成RowVersion值,旧值会丢失。
内容的提问来源于stack exchange,提问作者Timmeh
相关产品推荐
相关产品推荐

