SQL 无法为 SQL 服务器 2014 创建 TIMESTAMP 列

SQL cant create column for TIMESTAMP for SQL server 2014

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

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

我收到这个错误:

Msg 156, Level 15, State 1, Line 13
Incorrect syntax near the keyword 'on'.

我不知道为什么,我尝试了不同的方式来编写查询,但无法使 "ON UPDATE" 部分起作用。

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

alter table Items 
   add ModifiedTime timestamp not null
       default current_timestamp

该查询有效,但是 ModifiedTime 列中显示的值完全错误,它说:0x0000000000002713。我也不知道为什么这么说..

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

首先 - T-SQL 中的 TIMESTAMP 与常规日期和时间 无关 - 它是 二进制行版本 指标,真的(请参阅相关的 TechNet documentation - 现在称为 ROWVERSION)。

如果您想跟踪日期和时间,请使用 DATETIME2(n)n 是所需的秒后逗号精度,3 = 毫秒 - 0 到 7 之间的值是允许的)

其次 - 您使用的语法(其中的 on update current_timestamp; 部分)是无效的 T-SQL 语法。 T-SQL 中没有声明性方式来定义在行更改时更新的列 - 如果您想跟踪 "last modified date",您需要一个触发器。

更新:

你的 table 应该看起来像

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

我自己对 SQL 中的时间戳不太熟悉,但快速 Google 后,我认为您对它们的理解是错误的。根据

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

一个时间戳实际上并不存储一个date/time。它只是存储一个二进制数,允许您识别对数据库进行更改的顺序。

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

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;

SQL小提琴:http://sqlfiddle.com/#!6/ea41c/1