2015-11-11 41 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