触发或存储过程

时间:2017-08-10 08:31:15

标签: sql sql-server triggers procedure

我需要每次在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

触发器工作但它尚未生产。我一直在阅读触发器是如何坏和坏,但我不知道如何使用存储过程来执行此操作。 触发器是个好主意吗?如果没有,我如何对存储过程执行相同操作?

1 个答案:

答案 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