使用此声明时
create table demo (
ts timestamp
)
insert into demo select current_timestamp
我收到以下错误:
无法将显式值插入时间戳列。将INSERT与列列表一起使用以排除时间戳列,或将DEFAULT插入时间戳列
如何将当前时间插入timestamp
列?
答案 0 :(得分:48)
According to MSDN,timestamp
是一种公开自动生成的唯一二进制文件的数据类型 数据库中的数字。时间戳通常用作机制 用于版本标记表行。存储大小为8个字节。该 timestamp数据类型只是一个递增的数字,而不是 保留日期或时间。要记录日期或时间,请使用日期时间 数据类型。
您可能正在寻找datetime
数据类型。
答案 1 :(得分:21)
如果您需要复制完全相同的时间戳数据,请将目标表中的数据类型从timestamp更改为binary(8) - 我使用了varbinary(8)并且它工作正常。
这显然打破了目标表中的任何时间戳功能,因此请确保您首先使用该功能。
答案 2 :(得分:12)
您无法显式地将值插入时间戳列。它是自动生成的。不要在insert语句中使用此列。有关详细信息,请参阅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
答案 3 :(得分:7)
答案:你不能,这就是原因。
在较新版本的SQL Server中,timestamp
被重命名为RowVersion
。这是正确的,因为时间戳非常误导。
SQL Server时间戳不是由用户设置的,不代表日期或时间。 timestamp只是一个连续数字的二进制表示,它只对确保一行没有被读取而有所改变。
如果要存储日期或时间,请不要使用时间戳,必须使用其他数据类型之一,例如datetime
,smalldatetime
,date
,{ {1}}或time
例如:
DATETIME2
所以时间戳是某种二进制数。如果我们尝试将它投射到日期时间怎么办?
create table wtf (
id INT,
leet timestamp
)
insert into wtf (id) values (15)
select * from wtf
15 0x00000000000007D3
我当前的年份不是1900年。所以我不确定SQL Server在想什么。
答案 4 :(得分:2)
假设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
答案 5 :(得分:0)
这些答案中有一些很好的信息。假设您正在处理无法更改的数据库,并且正在将数据从表的一个版本复制到另一个版本,或从一个数据库中的同一表复制到另一个数据库。还假设有很多列,您要么需要所有列中的数据,要么不需要的列没有默认值。您需要使用所有列名编写查询。
这是一个查询,该查询返回表的所有非时间戳列名,您可以将其剪切并粘贴到插入查询中。仅供参考: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
答案 6 :(得分:-2)
创建表演示( id int, ts时间戳 )
插入demo(id,ts) 值(1,DEFAULT)