【问题标题】:SQL: Problems with update in a triggerSQL:触发器中的更新问题
【发布时间】:2015-12-11 19:44:52
【问题描述】:

我的桌子有问题,我无法真正解决这个问题。我的桌子是这样的:

表 1 - 技能

是的,我知道这不是英语,但应该没问题。

我有另一个看起来像这样的表:

表 2 - Skema

我的表 1 上有一个触发器,它将数据插入到表 2 中

CREATE TRIGGER [Skema_Opdatering]
ON [dbo].[Skilt]
FOR INSERT, UPDATE
AS
BEGIN
    SET NOCOUNT ON

    UPDATE Skema SET Skema.Emne = Skilt.Arbejdsopgave
    FROM Skilt
    WHERE CONVERT(varchar(25),Skema.Tid,108) 
    BETWEEN 
    dateadd(minute,((DATEDIFF(minute, cast(0 as DateTime), skilt.Tid_startet) + 7)/ 15) * 15, cast(0 as DateTime))
    AND
    dateadd(minute,((DATEDIFF(minute, cast(0 as DateTime), skilt.Tid_sluttet) + 7)/ 15) * 15, cast(0 as DateTime))
    AND
    CONVERT(varchar(25),Skema.Tid,105) = CONVERT(varchar(25),Skilt.Dato,105)
    ;
END

但我的问题是,如果我插入/更新超过 1 次,它不会从表 2 中删除旧值,我最终会得到一个应该为 NULL 但有值的行。所以我的问题是如何在另一个更新/插入之前将我的表重置为 NULL,以便我的触发器可以插入新值?

【问题讨论】:

    标签: sql sql-server sql-update


    【解决方案1】:

    尝试从 Table2 中导入数据并将列更改为行,然后在第三个(Junction 表)中插入记录,稍后您可以再次对其进行修改。这样您将更加掌握它并且出错的机会将是较小。

    【讨论】:

      【解决方案2】:

      DATEADD 将返回SMALLDATETIMESkema.Tid 列是TIME 类型。我认为你应该 CONVERTCAST SMALLDATETIMETIME

      类似这样的:

      -- CONVERT
      Skema.Tid = CONVERT(TIME, DATEADD(...))
      
      --CAST
      Skema.Tid = CAST(DATEADD(...) AS TIME)
      

      【讨论】:

      • 您应该改用别名表。示例:Table1 AS T1 然后使用 T1.column
      • SELECT A.Date_Column FROM TABLEA AS A INNER JOIN TABLEB AS B ON B.Time_Column = CAST (A.Date_Column AS Time)
      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2021-03-04
      • 2011-08-06
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多