【问题标题】:How to write a trigger that executes stored procedure?如何编写执行存储过程的触发器?
【发布时间】:2021-07-18 16:06:39
【问题描述】:

我有一个计算此人年龄的存储过程。这里是:

ALTER PROCEDURE [dbo].[CalculateAge]
AS
    UPDATE Person
    SET Age = DATEDIFF(year, BirthDate,  GETDATE() ) 
    WHERE Age IS Null;

我想编写一个触发器,它会在添加新人时自动填充列年龄 是否可以编写一个触发器来执行上面编写的过程,或者在触发器中编写过程的逻辑更容易?

【问题讨论】:

    标签: sql stored-procedures triggers ssms


    【解决方案1】:

    要在触发器中有效地使用过程,您需要传入一个参数,为此我们可以使用用户定义的表。尽管基于问题,您的过程似乎只是更新所有行,因此不需要参数。

    CREATE TRIGGER dbo.Person_Update ON dbo.Person AFTER UPDATE
    AS
       EXEC dbo.CalculateAge 
    

    【讨论】:

    • 这就是您执行过程的方式,而不是您在触发器上下文中以基于集合的方式正确执行过程的方式;当更新 2 或 2000 行时,您的简单 exec 将如何应对。
    • 根据插入的表传入用户定义的表类型
    • 太好了,所以将它添加到您的答案中!
    • @ZachHutchins 你能具体说明你的意思吗?不太明白你的意思
    • @jamesss 是的,它展示了它在触发器创建中的外观.. 不确定您是否在假设更新后这样做
    【解决方案2】:

    这里最好的解决方案是不使用触发器,只需将计算列添加到表中

    alter table MyTable add Age=Datediff(year, BirthDate,  Getdate())
    

    这样查询表时值总是正确的。

    有关计算列的完整详细信息,请参阅documentation

    编辑

    要使用触发器来实现这样一个简单的更新,在触发器中执行它是有意义的

    create trigger [dbo].[TriggerName] on dbo.TableName 
    for insert 
    as
    if @@RowCount=0 return
    set nocount on
    
    update p set p.age=DateDiff(year, BirthDate, GetDate()) 
    from inserted i
         join person p on p.Id = i.Id --<< Id is the primary key of the table
    

    【讨论】:

    • 我会坚持一个观点,这样你就有选择
    • 创建一个单独的视图意味着必须修改代码以从视图中选择或加入视图,这是一个更好的选择吗?
    • 谢谢!只是在我的工作中我需要使用触发器
    • @jamesss 好的,在这种情况下,我将在触发器中实现,并通过示例进行了修改。还有一点 - person 单数表示该表将包含一个人,更好的名称是 people,因为毫无疑问您有很多人。
    • 非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2011-07-20
    • 2020-05-20
    • 2015-07-01
    相关资源
    最近更新 更多