SQL Server触发器来更新另一个表的列

时间:2019-02-03 15:35:23

标签: sql sql-server

我有两个名为Table ATable B的SQL Server表。我有一个应用程序,它同时在Table A中插入一行,在Table B中插入三行。如下面的屏幕快照所示,我们可以基于ID A中的Table列和TransID中的Table B列链接这些插入的记录。

在表B的数据插入期间,如果插入的3行中的任何行在Printed列中包含名为Printed的值,我想更新我的Table A的相关记录的{{ 1}}列也移至PrintStatus

如何为此编写SQL Server触发器?

3 个答案:

答案 0 :(得分:4)

最好的解决方案是在您的代码(应用)中执行此操作,但是如果没有办法, 您可以为表B插入后插入触发器,例如下面的触发器示例:

CREATE TRIGGER [dbo].[YourTrigger] ON [dbo].[TableB]
    AFTER INSERT
AS
DECLARE @id INT
BEGIN
SET NOCOUNT ON;
 SET @id = (SELECT DISTINCT ID FROM Inserted)
 IF EXISTS (SELECT * FROM Inserted WHERE Printed='Printed')   
  UPDATE TableA
  SET PrintStatus='Printed'
  WHERE ID = @id

END

这可以帮助您

答案 1 :(得分:2)

对于您的问题可能是正确的:(不确定100%)

CREATE TRIGGER TriggerTableB
ON TableB
AFTER INSERT
AS
    UPDATE TableA AS A
    SET PrintStatus = 'Printed'
    WHERE A.TranID = inserted.ID
        AND 'Printed' = (SELECT MAX(I.Printed)
                         FROM inserted AS I)

答案 2 :(得分:0)

我建议查询信息:

select a.*,
       (case when exists (select 1
                          from b
                          where b.id = a.tranid and b.printed = 'Printed'
                         )
             then 'Printed'
        end) as printstatus
from a;

这比编写查询要简单,您可以将其包装在视图中。

从性能的角度来看,b(id, printed)上的索引应该使它非常快-而不会使插入慢下来。

如果您要考虑insertupdatedelete,则触发器可能会非常复杂。如果可能的话,我宁愿避免这种并发症。