2015-11-11 38 views
1

我无法用下面的查询创建一个表中的列:SQL不能为TIMESTAMP列创建为SQL Server 2014

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'.

我不不知道为什么,我尝试了不同的方法来编写查询,但无法使“更新”部分正常工作。

我也尝试了将使用此查询列:

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,是否可以帮助任何

+0

什么是 “关于更新CURRENT_TIMESTAMP” 什么意思? – jarlh

+0

加入谷歌来源:)当有人使用更新表中的“项目”行时,这个ModifiedTime列将使用这个“on update”部分自动更新最新的“current_timestamp”。我有另一个名为CreatedTime的列,并且其中一个工作正常,它的用途是注册表项中创建行的日期时间。但后来我想要另一列“ModifiedTime”,它告诉我某人“更新”此行的时间,例如,更改了行中的值。 – Mikael

+0

推荐阅读:[自动更新修改日期与SQL Server中创建触发器(http://stackoverflow.com/a/7737993/1225845) – AHiggins

回答

2

的第一所有 - TIMESTAMP在T-SQL具有什么做定期日期&时间 - 这是一个二进制行版本指标,真的(查看其相关TechNet documentation - 它现在叫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

好吧!那么我将如何创建这个列?我需要输入什么查询?当行更新时,为了保持这一列更新,我需要一个你说的触发器,这将是什么提示?我已经有了上面提到的CreatedTime列,它是使用这个查询创建的:**改变表项目添加CreatedTime日期时间不空null默认getdate(); **我需要对该列做任何更改或者是一个好吗? – Mikael

+0

@Mikael:如果你的SQL Server上的** ** 2008或更高版本,我建议你到*停止使用*'DATETIME',而使用'DATETIME2(3)'(或为精密任何其他值,从0-7 - 3毫秒是一个合理的默认) –

+0

是SQL服务器2014 IM,所以CreatedTime还应使用DATETIME2(3)然后 – Mikael

0

我不是太熟悉的时间戳在SQL中我自己,但快速谷歌后,我会建议你对他们的理解是错误的。据

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