SQL 无法为 SQL Server 2014 的 TIMESTAMP 创建列

问题描述 投票:0回答:3

我在使用以下查询在表中创建列时遇到问题:

alter table Items 
   add ModifiedTime timestamp not null
       default current_timestamp on update current_timestamp;

我收到此错误:

消息 156,第 15 级,状态 1,第 13 行
关键字“on”附近的语法不正确。

我不知道为什么,我尝试了不同的方法来编写查询,但无法让“ON UPDATE”部分工作。

我还尝试使用此查询添加列:

alter table Items 
   add ModifiedTime timestamp not null
       default current_timestamp

该查询有效,但

ModifiedTime
列中显示的值完全错误,它的意思是:
0x0000000000002713
。我也不知道为什么这么说..

我正在使用 Microsoft SQL Server 2014 Management Studio,SQL Server 是 SQL Server Express 64 位,版本 12.0.2000.8 如果这有帮助的话

sql timestamp sql-server-2014-express
3个回答
2
投票

首先 - T-SQL 中的

TIMESTAMP
与常规日期和时间没有任何关系 - 它实际上是一个 二进制行版本 指示器(请参阅相关的 TechNet 文档 - 现在称为 ROWVERSION)。

如果您想跟踪日期和时间,请使用

DATETIME2(n)

n
是所需的秒后逗号精度,3 = 毫秒 - 允许使用 0 到 7 的值)

其次 - 您使用的语法(其中的

on update current_timestamp;

部分)不是有效的 T-SQL 语法。 T-SQL 中没有声明性的方式来定义行更改时要更新的列 - 如果您想跟踪“上次修改日期”,则需要一个触发器。


更新:

你的桌子必须看起来像这样

CREATE TABLE dbo.Items ( ItemsID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Items PRIMARY KEY CLUSTERED, ....(some other columns).... CreatedDate DATETIME2(3) CONSTRAINT DF_Items_CreatedDate DEFAULT (SYSDATETIME()), ModifiedDate DATETIME2(3) CONSTRAINT DF_Items_ModifiedDate DEFAULT (SYSDATETIME()) )

然后你需要一个触发器

CREATE TRIGGER trgItems_Update ON dbo.Items AFTER UPDATE AS UPDATE it SET ModifiedDate = SYSDATETIME() FROM dbo.Items it INNER JOIN Inserted i ON it.ItemsID = i.ItemsID



0
投票

http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

时间戳实际上并不存储日期/时间。它只是存储一个二进制数,使您可以识别对数据库进行更改的顺序。

我假设这不是您想要的,并且您实际上想要一个日期和时间?如果是这样,我建议您改用日期时间。例如:

create table Items ( id int primary key ); alter table Items add ModifiedTime datetime not null default current_timestamp; CREATE TRIGGER itemstrigger ON Items AFTER INSERT, UPDATE AS BEGIN UPDATE i SET i.ModifiedTime = current_timestamp from inserted ins join Items i on i.id = ins.id END;

SQLFiddle:
http://sqlfiddle.com/#!6/ea41c/1


0
投票

更改表您的表名称 添加行版本时间戳不为空;

SQL Server 中的 TIMESTAMP 数据类型是 ROWVERSION 的同义词。每次修改行时,这种类型的列都会自动更新。

© www.soinside.com 2019 - 2024. All rights reserved.