仅在SQL Server中第一次更新行

时间:2014-10-23 08:48:50

标签: sql-server triggers sql-update

使用我在下面显示的触发器会将price产品更新为折扣。但我希望在以后的插入中,不应更新已应用折扣的记录。

我可以添加什么?

create Trigger tri on t1
after insert As
    UPDATE t1
    SET price = CASE 
                   WHEN column1 = 'Rebate' THEN price * 0.5
                                           ELSE price 
                END

3 个答案:

答案 0 :(得分:0)

您错过了指示要更新哪一行的位置。例如,查看此查询:

declare @var table (id int)
update Cities
set fullname = 'Melbourne'
output inserted.id into @var 
where name = 'MEL'

select * from @var

如果inital update命令使用输出命令,则在触发器中使用@ var.id来限制行。

where t1.id = @var.id

取决于系统的其余部分,您可能需要更多地处理此问题以将ID传递给触发器。

最好是编写一个存储过程来更新表并在那里使用逻辑,节省一些cpu周期和IO。

答案 1 :(得分:0)

尝试在表中使用一个标志列来指示是否应用了回扣..(这不是确切的sql查询来进行更新你需要添加插入表来获取数据)

UPDATE t1
SET     price=  CASE  WHEN column1='Rebate'   THEN price*0.5
ELSE price
END,flag = 'Rebate applied'
where flag != 'Rebate applied' -- change flag to bit

答案 2 :(得分:0)

现在,每次插入内容时,都会在表格中触发 ALL ROWS 更新。

您需要做的是包含Inserted伪表中的值 - 该表列出实际插入的所有行 - 这样您就可以更新那些(并保留其他任何内容)。

因此,请尝试将触发器更改为以下内容:

CREATE TRIGGER tri ON dbo.t1
AFTER INSERT
AS
    UPDATE t1
    SET price = CASE 
                   WHEN column1 = 'Rebate' THEN price * 0.5
                                           ELSE price 
                END
    FROM Inserted i          -- This is the pseudo table with all inserted rows
    WHERE i.ID = t1.ID       -- make a WHERE condition to match rows up, based on some "ID" column