我有两个名为Table A
和Table B
的SQL Server表。我有一个应用程序,它同时在Table A
中插入一行,在Table B
中插入三行。如下面的屏幕快照所示,我们可以基于ID
A中的Table
列和TransID
中的Table B
列链接这些插入的记录。
在表B的数据插入期间,如果插入的3行中的任何行在Printed
列中包含名为Printed
的值,我想更新我的Table A
的相关记录的{{ 1}}列也移至PrintStatus
。
如何为此编写SQL Server触发器?
答案 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)
上的索引应该使它非常快-而不会使插入慢下来。
如果您要考虑insert
,update
和delete
,则触发器可能会非常复杂。如果可能的话,我宁愿避免这种并发症。