Sql server Sql server更新时设置当前时间戳

Sql server Sql server更新时设置当前时间戳,sql-server,Sql Server,我需要一个时间戳字段,它在用户每次修改记录时更新 到目前为止,我使用了MySql,我甚至可以在字段创建中使用它: Alter table myTable add `last_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP **ON UPDATE CURRENT_TIMESTAMP** 我在Sql Server中找不到这种可能性 然后我试着写一个触发器 在MySql触发器中,这很简单: Set new.last_time=CURRENT_TI

我需要一个时间戳字段,它在用户每次修改记录时更新

到目前为止,我使用了MySql,我甚至可以在字段创建中使用它:

Alter table myTable add `last_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP **ON UPDATE CURRENT_TIMESTAMP**
我在Sql Server中找不到这种可能性

然后我试着写一个触发器

在MySql触发器中,这很简单:

Set new.last_time=CURRENT_TIMESTAMP();
Sql Server似乎既不知道新语法,也不知道旧语法,它给了我编译错误

委员会:

工作正常,但它更新了所有行,而不是当前行

难道没有办法告诉Sql Server更新当前记录吗?我是否应该使用用户“更新myid=something”


SQL Server不知道它正在处理的实际记录是哪个吗?

使用rowversion数据类型。Rowversion通常用作MS-SQL server中为表行加盖版本戳的机制。rowversion数据类型只是一个递增的数字,不保留日期或时间。要记录日期或时间,请使用datetime2数据类型。
有关更多信息,请阅读msdn()中的rowversion()

,如果您确实需要时间戳,请在插入和更新时触发一个触发器,用当前时间戳更新列

CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE 
AS
  UPDATE dbo.YourTable
  SET last_changed = GETDATE()
  FROM Inserted i
要更新单行(已编辑或插入),应使用

CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE 
AS
  UPDATE f set LastUpdate=GETDATE() 
  FROM 
  dbo.[YourTable] AS f 
  INNER JOIN inserted 
  AS i 
  ON f.rowID = i.rowID;
这些应该是你所需要的。GETUTCDATE(),如果您希望使用UTC格式(我更喜欢)

SQL Server完全知道它处理的行

更新myTable set last_time=当前_时间戳;成功了,但它成功了 更新了所有行,而不是当前行

是的,猜猜看-因为这正是您告诉SQL Server的:更新表中的所有行

Sql Server不知道它正在处理的实际记录是什么吗

集合没有当前行;)问题就从这里开始


要做到这一点,唯一的方法就是在我开头的回答中:一个时间戳。但是,由于误解,我添加了一条建议:获取一本关于SQL基础知识的书。

您好,您的示例:UPDATE dbo.YourTable SET last_changed=GETDATE(),来自插入的I。。。还更新了表中的所有行。。。因此,我将其更改为以下内容,并且它非常有效(尽管您多次指出我在SQL基础知识方面存在严重问题:-):将f set last_changed=GETDATE()从dbo.MyTable更新为f internal JOIN,并在f.myid=I.myid上插入I;谢谢你的帮助!我不知道插入的逻辑表。
CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE 
AS
  UPDATE f set LastUpdate=GETDATE() 
  FROM 
  dbo.[YourTable] AS f 
  INNER JOIN inserted 
  AS i 
  ON f.rowID = i.rowID;