我在使用以下查询在表中创建列时遇到问题:
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 如果这有帮助的话
首先 - 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
时间戳实际上并不存储日期/时间。它只是存储一个二进制数,使您可以识别对数据库进行更改的顺序。
我假设这不是您想要的,并且您实际上想要一个日期和时间?如果是这样,我建议您改用日期时间。例如:
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
更改表您的表名称 添加行版本时间戳不为空;
SQL Server 中的 TIMESTAMP 数据类型是 ROWVERSION 的同义词。每次修改行时,这种类型的列都会自动更新。