69

使用此语句时

create table demo (
    ts timestamp
)

insert into demo select current_timestamp

我收到以下错误:

无法将显式值插入时间戳列。将 INSERT 与列列表一起使用以排除时间戳列,或将 DEFAULT 插入时间戳列

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

4

7 回答 7

67

根据 MSDNtimestamp

是一种在数据库中公开自动生成的唯一二进制数的数据类型。时间戳通常用作对表行进行版本标记的机制。存储大小为 8 个字节。时间戳数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用 datetime 数据类型。

您可能正在寻找datetime数据类型。

于 2012-04-21T19:53:03.363 回答
29

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

这显然会破坏目标表中的任何时间戳功能,因此请确保您首先对此表示满意。

于 2013-05-03T16:56:05.567 回答
15

您不能将值显式插入时间戳列。它是自动生成的。不要在插入语句中使用此列。有关详细信息,请参阅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
于 2012-04-21T19:56:46.137 回答
13

如何使用 SQL Server 将当前时间插入时间戳:

在较新版本的 SQL Server 中,timestamp重命名为RowVersion. 没错,因为时间戳名称具有误导性。

SQL Server 的timestamp不是由用户设置,不代表日期或时间。时间戳仅有助于确保行在读取后没有更改。

如果要存储日期或时间,请勿使用时间戳,必须使用其他数据类型之一,例如datetime, smalldatetime, date,timeDATETIME2

例如:

create table wtf (
    id INT,
    leet timestamp
)

insert into wtf (id) values (15)

select * from wtf

15    0x00000000000007D3 

mssql 中的“时间戳”是某种内部数据类型。将该数字转换为 datetime 会产生一个无意义的数字。

于 2014-04-04T14:04:31.273 回答
5

假设 Table1 和 Table2 有三列 A、B 和 TimeStamp。我想从 Table1 插入 Table2。

这会因时间戳错误而失败:

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

这有效:

Insert Into Table2
Select Table1.A, Table1.B, null From Table1
于 2013-04-29T10:26:17.140 回答
4

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

这是一个查询,它返回表的所有非时间戳列名称,您可以将其剪切并粘贴到插入查询中。仅供参考: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, '')

只需将顶部的表格名称从“产品”更改为您的表格名称。查询将返回列名列表:

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
于 2019-04-13T20:27:39.563 回答
-1

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

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

于 2016-02-26T19:59:40.770 回答