【问题标题】:How to convert positive inserted values into negative after update or insert?更新或插入后如何将插入的正值转换为负值?
【发布时间】:2015-12-23 13:36:34
【问题描述】:

我想编写一个触发器,它应该找出插入或更新的值是否为正值并将其替换为负值。 我试过这段代码:

create trigger trigger_after_updaten on Inbox
AFTER Update 
AS
begin
DECLARE @t INT 
If ((SELECT @t=ID_In FROM updated)>0) 
UPDATE Inbox SET t=@t*-1
END

但它显示此错误:

Msg 102, Level 15, State 1, Procedure trigger_after_updaten, Line 223
Incorrect syntax near '='.

如何以正确的方式做到这一点?

【问题讨论】:

  • 触发器定义不正确。始终认为插入的表有几行。而且 SQL Server 没有更新的表,只是“插入”和“删除”。
  • 另一种解决方案是将 CHECK CONSTRAINT 添加到列中,限制接受的值 (msdn.microsoft.com/en-GB/library/ms176104.aspx)。
  • 我是第二个目的地的建议 - 让数据库拒绝不正确的数据比默默地“修复”它要好得多。静默修复可能会被遗忘,然后会在以后产生非常混乱的调试体验。

标签: sql-server triggers sql-update sql-insert


【解决方案1】:

这应该适用于您的触发器:

CREATE TRIGGER trigger_after_updaten on Inbox
AFTER UPDATE 
AS
BEGIN
    UPDATE Inbox SET t = CASE WHEN(inserted.t < 0) THEN inserted.t ELSE -inserted.t END
    FROM inserted
    INNER JOIN Inbox 
        ON inserted.KEY_FIELD = Inbox.KEY_FIELD
END

【讨论】:

  • 但是这段代码不检查更新的值是负数还是正数,我只想转换正值。
  • 它使用案例检查这种情况(我在发布后一分钟内更新了帖子)
  • 最好在ON 子句中使用表的PK,而不是再次使用t 值。如果你有一个插入,比如-1,那么这个查询将(毫无意义地)更新表中当前等于-1的所有现有条目。
  • 谢谢,但它仍然给出这个错误你知道为什么吗?消息 208,级别 16,状态 1,过程 trigger_after_updaten,第 235 行无效的对象名称“已更新”。
  • SQL Server 中没有“更新”表。只有“插入”和“删除”。在此答案的脚本中,使用了“插入”表。它包含 UPDATE 生成的新值。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多