SQL:触发器

时间:2015-12-10 08:56:05

标签: sql sql-server sql-update

我的桌子出了问题,我无法解决这个问题。我的表看起来像这样:

表1 - Skilt My table

是的,我知道它不是英语,但不应该是一个问题。

我有另一张表如下:

表2 - Skema

Table 2

我的表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,以便我的触发器可以插入新值?

2 个答案:

答案 0 :(得分:0)

尝试从Table2导入数据并将列更改为行,然后在第三个(Junction表)中插入记录,稍后您可以再次修改它。这样您将有更多的抓地力,错误的可能性将是较小的一个。

答案 1 :(得分:0)

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

这样的事情:

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

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