Sql 我的扳机坏了
我一直在为我的SQL数据库开发触发器 各表: 表1:IDint、自动递增、value1varchar、value2varchar、countint TABLE1_History:IDSeparate from TABLE1.ID,int,auto increment,与TABLE1相同的列,但添加了TimeStampsmalldatetime 守则: 应该发生什么: 当我向TABLE1添加新行时,我希望更新TABLE1\u历史记录 表1\u历史记录仅在以下情况下添加新行:行已经存在,且与新行具有相同的值1和值2,并且自添加该行以来已超过24小时 否则,计数器将增加 发生了什么: 截至目前:表1\u历史记录每次都会更新。值是否匹配并不重要Sql 我的扳机坏了,sql,sql-server,sql-server-2008,triggers,sql-update,Sql,Sql Server,Sql Server 2008,Triggers,Sql Update,我一直在为我的SQL数据库开发触发器 各表: 表1:IDint、自动递增、value1varchar、value2varchar、countint TABLE1_History:IDSeparate from TABLE1.ID,int,auto increment,与TABLE1相同的列,但添加了TimeStampsmalldatetime 守则: 应该发生什么: 当我向TABLE1添加新行时,我希望更新TABLE1\u历史记录 表1\u历史记录仅在以下情况下添加新行:行已经存在,且与新行具有
在我决定将TABLE1_History.ID与TABLE1.ID分开之前,它似乎起到了作用。您应该避免使用关键字,以便使用时间戳。如果你能把它改成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
SQL Server?请添加标签。你是说stackoverflow中的标签?在这种情况下,修复了。可能比我的解决方案更好。当值相同时,触发器工作。但当它们彼此不同时,什么也不会发生。我现在尝试清空表格,但意识到历史上没有添加任何内容now@Yoan已修复以允许“新”记录
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