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;
我在使用以下查询在 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;