如何更新另一列时更新列?

时间:2015-04-04 05:26:05

标签: sql sql-server sql-server-2012

我有一个表de有3列id(主键int),A(int)和B(int)。

我的要求是在A上有更新时更新B.

所以我使用了触发器,我尝试了如下

 create trigger deTrigger on [dbo].[de]
 for update
 As
 declare @aValue int;
 select @aValue=i.A from inserted i;
 update de set B =@aValue 
 GO

但我不知道如何在上面的更新查询中使用where条件,所以当我在单个记录中更新A时,B col的所有行都会更新。

如果有其他方式使用触发器,那么请建议

3 个答案:

答案 0 :(得分:2)

你需要这样的东西:

CREATE TRIGGER deTrigger 
ON [dbo].[de]
FOR UPDATE
AS
    UPDATE de 
    SET B = i.A
    FROM Inserted i
    INNER JOIN Deleted d ON i.ID = d.ID
    WHERE i.ID = de.ID
      AND i.A <> d.A
 GO

基本上,您需要加入Inserted伪表(因为它可能包含多行),您还需要加入{ {1}}伪表。比较DeletedInserted的值,您可以获得对列Deleted进行更新的行,并且可以在这些行中设置A的值B

答案 1 :(得分:1)

标准SQL Server触发器是&#34;之后&#34;触发。这对于在事实&#34;之后更新日志和其他类型的&#34;使用。但是你想要在它进入表之前修改传入的流。

为此你需要&#34;之前&#34;触发。

哪个SQL Server没有......

不过不用担心,SQL Server 确实有一个&#34;而不是&#34;触发。最初仅用于观看,它也方便地用于表格,可能因此MS开发人员不必在实施之前解决所有问题。触发器。

这是一个例子。计划表具有日期时间字段(SchedDate)和关联的整数字段(SchedHour),其仅包含datetime字段的小时。因此,每当更改SchedDate时,必须将小时写入SchedHour。

create trigger T_Schedule_bu ON Schedule 
instead of update as begin
    set NoCount On;

    update  s
        set s.Field1    = i.Field1,
            s.Field2    = i.Field2,
            s.SchedDate = i.SchedDate,
            s.SchedHour = 
                case when i.SchedDate <> s.SchedDate
                     then DatePart( hour, i.SchedDate )
                     else s.SchedHour
                end
    from    Schedule    s
    join    inserted    i
        on  i.ID    = s.ID
end;

其他字段无条件更改;仅当SchedDate也被更改时,SchedHour才会更改。实际上,在这个特定的例子中,执行该测试并不是必需的。它只是展示了如何做到这一点。

如果您不熟悉&#34;而不是&#34;触发器,只知道触发器本身必须最终执行DML到目标表,否则它不会发生。所以一种方式来呈现一个表&#34;只读#34;创造一个&#34;而不是&#34;没有任何作用的触发器。

答案 2 :(得分:0)

试试这段代码 -

create trigger deTrigger
on [dbo].[de]
for update
As
    update de
    set B = i.A
    FROM INSERTED i
    WHERE de.id in (SELECT i.ID
        FROM inserted i)