Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 更新或插入后如何将插入的正值转换为负值?_Sql Server_Triggers_Sql Update_Sql Insert - Fatal编程技术网

Sql server 更新或插入后如何将插入的正值转换为负值?

Sql server 更新或插入后如何将插入的正值转换为负值?,sql-server,triggers,sql-update,sql-insert,Sql Server,Triggers,Sql Update,Sql Insert,我想写一个触发器,它应该找到插入或更新的值是否为正值,并用负值替换它。 我尝试了以下代码: 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, Procedur

我想写一个触发器,它应该找到插入或更新的值是否为正值,并用负值替换它。 我尝试了以下代码:

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 '='.

如何以正确的方式进行

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

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
在收件箱中更新后创建触发器
更新后
作为
开始
更新收件箱集t=CASE WHEN(inserted.t<0)然后inserted.t ELSE-inserted.t END
从插入
内部加入收件箱
在inserted.KEY\u字段中=Inbox.KEY\u字段
结束

错误的触发器定义。始终认为插入表有几行。SQL Server没有更新的表,只是“插入”和“删除”。另一种解决方案是在列中添加一个检查约束,限制可接受的值()。我想听听第二个目的地的建议——让DB拒绝不正确的数据比默默地“修复”数据要好得多。静默修复可能会被遗忘,然后在以后产生异常混乱的调试体验。但此代码不检查更新的值是负值还是正值,我只想转换正值。它使用大小写检查此情况(我在发布后一分钟内更新了帖子)最好在
ON
子句中使用表的PK,而不是再次使用
t
值。如果您有一个insert,例如,
-1
,那么此查询将(无意义地)更新表中当前等于
-1
的所有现有条目。谢谢,但它仍然会出现此错误。您知道为什么吗?Msg 208,级别16,状态1,更新后的过程触发器,第235行无效的对象名称“已更新”。SQL Server中没有“已更新”表。仅“插入”和“删除”。在这个答案的脚本中,使用了“插入”表。它包含更新生成的新值。