删除触发器getdate()返回1906年

JKK*_*JKK 1 sql sql-server sql-server-2000

我想在删除的记录上设置日期/时间戳,但我得到了奇怪的结果.当此触发器触发时,它将日期设置为1906!

我已尝试GETDATE()在查询中使用该函数,UPDATE并在表属性上使用默认值.它适用于我手动输入到DELETED_RECORDS表中的记录,但由于实际删除而移入的任何记录都有1906日期.我不确定发生了什么

ALTER TRIGGER [dbo].[Backup_TT_Deleted_Records]
ON [dbo].[tblLLS_TT]
FOR DELETE
AS
  BEGIN
      INSERT INTO dbo.tblLLS_TT_DELETED_RECORDS
      SELECT *
      FROM   Deleted

      UPDATE dbo.tblLLS_TT_DELETED_RECORDS
      SET    Deleted_DTTM = GETDATE()
      WHERE  dbo.tblLLS_TT_DELETED_RECORDS.Deleted_DTTM IS NULL
  END 
Run Code Online (Sandbox Code Playgroud)

还有上面的触发器,如果​​我在DELETED_RECORDS表上输入一个记录而留下Delete_DTTMnull然后删除一个记录,导致触发器触发它将正确填写该记录,但是进入DELETED_RECORDS表中的记录将再次具有日期我还注意到每条记录的日期增加一天.

知道这里可能会发生什么吗?

您希望我执行的任何其他测试让我知道,我会发布结果.这个很奇怪.谢谢!

Mar*_*ith 6

您的插入语句如下

INSERT INTO dbo.tblLLS_TT_DELETED_RECORDS
SELECT *
FROM   Deleted 
Run Code Online (Sandbox Code Playgroud)

你既不是使用显式列列表中INSERT也不在SELECT.

你说

我还注意到每个记录的日期增加一天.

我的猜测是源中的列没有插入到您认为它们所在的目标列中.

您正在删除一批具有IDENTITY列值的行,2191 - 2555并将该int值插入到datetime列中,您将在1906年获得隐式强制转换为日期(整数被视为表示自1900年1 月1 以来的天数)

我假设源列可能IDENTITY会解释日期的升序性质.要解决此问题,请尝试明确指定两个列列表.另外需要注意的是,等效的源列和目标列必须位于相同的序号位置.例如,SQL Server将不会根据列名匹配它们.

INSERT INTO dbo.tblLLS_TT_DELETED_RECORDS
            (col1,
             col2,
             col3)
SELECT col1,
       col2,
       col3
FROM   Deleted 
Run Code Online (Sandbox Code Playgroud)

此外,你不需要单独的UPDATE声明,你也可以这样做INSERT

INSERT INTO dbo.tblLLS_TT_DELETED_RECORDS
            (col1,
             col2,
             col3,
             Deleted_DTTM)
SELECT col1,
       col2,
       col3,
       getdate()
FROM   Deleted 
Run Code Online (Sandbox Code Playgroud)