SQLServer: 无法在时间戳列中插入显式值

当使用此语句时

create table demo (
ts timestamp
)


insert into demo select current_timestamp

我得到以下错误:

无法在时间戳列中插入显式值。对列列表使用 INSERT 可以排除时间戳列,或者在时间戳列中插入 DEFAULT

如何向 timestamp列插入当前时间?

217377 次浏览

根据 MSDN timestamp

是公开自动生成的唯一二进制文件的数据类型 时间戳通常用作一种机制 存储大小为8字节 时间戳数据类型只是一个递增的数字,而不是 保留一个日期或时间。要记录一个日期或时间,使用日期时间 数据类型。

您可能需要查找 datetime数据类型。

不能将这些值显式地插入到时间戳列中。是自动生成的。不要在插入语句中使用此列。有关详细信息,请参阅 http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx

您可以使用日期时间而不是像下面这样的时间戳:

create table demo (
ts datetime
)


insert into demo select current_timestamp


select ts from demo

返回:

2014-04-04 09:20:01.153

假设表1和表2有三列 A、 B 和 TimeStamp。

这会导致时间戳错误:

Insert Into Table2
Select Table1.A, Table1.B, Table1.TimeStamp From Table1

这种方法是有效的:

Insert Into Table2
Select Table1.A, Table1.B, null From Table1

如果您需要复制完全相同的时间戳数据,请将目标表中的数据类型从时间戳改为二进制(8)——我使用了 varbinary8,它工作得很好。

这显然破坏了目标表中的任何时间戳功能,因此首先要确保您对此没有问题。

如何使用 SQLServer 将当前时间插入到时间戳中:

在 SQLServer 的新版本中,timestamp被重命名为 RowVersion

SQLServer 的 timestamp IS 不是由用户设置的,并且不表示日期或时间。时间戳只适用于确保行在被读取后没有发生更改。

如果要存储日期或时间,不要使用时间戳,必须使用其他数据类型之一,例如 datetimesmalldatetimedatetimeDATETIME2

例如:

create table foo (
id INT,
leet timestamp
)


insert into foo (id) values (15)


select * from foo


15    0x00000000000007D3

Mssql 中的‘ time戳’是某种内部数据类型。将该数字转换为 datetime 会产生一个无意义的数字。

创建表演示( Id int, 时间戳 )

插入到 demo (id,ts)中 值(1,DEFAULT)

这些答案中有一些很好的信息。假设您正在处理无法更改的数据库,并且正在将数据从表的一个版本复制到另一个版本,或者从一个数据库中的同一个表复制到另一个数据库。假设还有很多列,您要么需要来自所有列的数据,要么不需要的列没有默认值。您需要编写一个包含所有列名的查询。

下面是一个查询,它返回表的所有非时间戳列名,您可以将其剪切并粘贴到插入查询中。供参考: 189是时间戳的类型 ID。

declare @TableName nvarchar(50) = 'Product';


select stuff(
(select
', ' + columns.name
from
(select id from sysobjects where xtype = 'U' and name = @TableName) tables
inner join syscolumns columns on tables.id = columns.id
where columns.xtype <> 189
for xml path('')), 1, 2, '')

只需将顶部的表名从“ Product”更改为表名即可。查询将返回列名列表:

ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate

如果要将数据从一个数据库(DB1)复制到另一个数据库(DB2) ,可以使用这个查询。

insert DB2.dbo.Product (ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate)
select ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate
from DB1.dbo.Product