我需要每次在table2上有一个新条目时更新table1.field1来自table2.field2。我创建了一个触发器来完成这个:
CREATE [dbo].[insert_trg]
on [dbo].[TheCat99]
AFTER INSERT AS
BEGIN
Update therefore.dbo.thecat99
SET factura = (SELECT dbo.pedido.num_factura
From dbo.Pedido
Where dbo.thecat99.pedido=dbo.pedido.num_pedido)
WHERE dbo.thecat99.pedido = ( SELECT dbo.pedido.num_pedido
FROM dbo.pedido
Where dbo.thecat99.pedido = dbo.pedido.Num_Pedido)
AND dbo.thecat99.factura is NULL
END
触发器工作但它尚未生产。我一直在阅读触发器是如何坏和坏,但我不知道如何使用存储过程来执行此操作。 触发器是个好主意吗?如果没有,我如何对存储过程执行相同操作?
答案 0 :(得分:2)
触发器不坏也不邪恶。它们是一个很好的工具(对于某些任务,唯一的工具),但它们确实需要知识和谨慎使用,因为它们并不像初看起来那样简单。
作为一般规则,触发器应尽可能轻巧有效。 这是因为SQL Server不会将控制权返回给执行触发触发器的语句的人,直到触发器也完成为止。
话虽如此,您的更新代码可以像这样编写(效率更高,更易读):
UPDATE t
SET factura = p.num_factura
FROM therefore.dbo.thecat99 t
INNER JOIN dbo.Pedido p ON t.pedido= p.num_pedido
WHERE t.factura IS NULL
但是由于您没有使用inserted
表,这意味着每次将任何行插入TheCat99
pedido
值的所有行匹配num_pedido
中的Pedido
将用于更新。仍有改进的余地 - 使用inserted
表而不是thecat99
表示您只会处理刚插入thecat99
表的记录,因此您的代码将会很远效率更高:
UPDATE t
SET factura = p.num_factura
FROM inserted t
INNER JOIN dbo.Pedido p ON t.pedido= p.num_pedido
WHERE t.factura IS NULL