2013-06-12 64 views
0

我一直在为我的SQL数据库开发一个触发器。我的触发器不会工作

的表格:

TABLE1:ID(INT,自动增量),值1(VARCHAR),值2(VARCHAR),计数(INT)

TABLE1_History:ID(从TABLE1.ID独立,INT,自动增量),相同的列TABLE1但具有添加的时间戳(SMALLDATETIME)

的代码:

SELECT @@ROWCOUNT FROM TABLE1_History, INSERTED 
    WHERE TABLE1_History.value1 LIKE INSERTED.value1 
    AND TABLE1_History.value2 LIKE INSERTED.value2 
    AND DATEDIFF(HOUR,TABLE1_History."TimeStamp", GETDATE()) > 24; 

    IF(@@ROWCOUNT = 0) 
    BEGIN 
     INSERT INTO TABLE1_History(value1, value2, count, "TimeStamp") 
     SELECT value1, value2, count, GETDATE() FROM INSERTED 
    END 
    ELSE 
    BEGIN 
     UPDATE TABLE1_History 
     SET "TimeStamp" = GETDATE(), count = count+(SELECT count FROM INSERTED) 
     WHERE TABLE1_History.value1 LIKE (SELECT value1 FROM INSERTED) 
     AND TABLE1_History.value2 LIKE (SELECT value2 FROM INSERTED) 
     AND DATEDIFF(HOUR,TABLE1_History."TimeStamp", GETDATE()) < 24; 
    END 
END 

什么是应该发生的:

当我添加一个新行TABLE1我想TABLE1_History更新。

TABLE1_History ONLY中添加新行如果行已经用相同的值1 &值2作为新行存在,如果它已经24h以上,因为加入该行。

否则,计数器增加。

会发生什么:

截至目前:TABLE1_History得到每一次更新。如果值匹配或不匹配,则无关紧要。

在我决定让TABLE1_History.ID与TABLE1.ID分开之前,它似乎工作正常。

+0

SQL-Server?请添加标签。 –

+0

你的意思是在stackoverflow标签?在那种情况下,是固定的。 –

回答

1

你应该避免使用关键字TimeStamp。如果你可以把它改成LastModified什么

不使用@@ROWCOUNT,你可以加入INSERTED,我不知道为什么你正在使用LIKE。试试这个

IF NOT(EXISTS ( -- if it's not already in the table 
    SELECT value1 FROM TABLE1_History 
    JOIN INSERTED ON TABLE1_History.value1 = INSERTED.value1 
       AND TABLE1_History.value2 = INSERTED.value2 
    )) 
    OR EXISTS ( -- or its history was last modified over 24 hours ago 
    SELECT value1 FROM TABLE1_History 
    JOIN INSERTED ON TABLE1_History.value1 = INSERTED.value1 
       AND TABLE1_History.value2 = INSERTED.value2 
       AND DATEDIFF(HOUR,TABLE1_History."TimeStamp", GETDATE()) > 24 
    )  
BEGIN    -- insert it into the history table 
    INSERT INTO TABLE1_History(value1, value2, count, "TimeStamp") 
    SELECT value1, value2, count, GETDATE() FROM INSERTED 
END 
ELSE 
BEGIN    -- otherwise update the current history record 
    UPDATE th 
    SET th."TimeStamp" = GETDATE() 
     , th.count = th.count + INSERTED.count 
    FROM TABLE1_History th 
    JOIN INSERTED ON th.value1 = INSERTED.value1 
       AND th.value2 = INSERTED.value2 
       AND DATEDIFF(HOUR, th."TimeStamp", GETDATE()) < 24; 
END 
+0

可能比我的解决方案更好。触发器适用于值相同的情况。但是当他们彼此不同时,不会发生。 –

+0

我现在试图清空表格,并意识到现在历史上没有任何东西被添加 –

+0

@Yoan已修复以允许“新”记录 –