【问题标题】:SQL Stored Proc: Help converting to triggerSQL 存储过程:帮助转换为触发器
【发布时间】:2010-09-16 13:24:50
【问题描述】:

我想将存储过程转换为触发器。存储过程应该在插入/更新之后运行,但用户经常忘记执行它!

存储过程为某些行插入重新计算的值:

--Delete rows where RowCode=111
DELETE FROM dbo.TableA WHERE [year]>=1998 AND RowCode=111

--Insert new values for RowCode=111 for years>=1998
INSERT INTO dbo.TableA
SELECT [Year], RowCode=111, ColCode, SUM(Amt) AS Amt
FROM dbo.TableA
WHERE [Year]>=1998 AND RowCode IN (1,12,23) AND ColCode=14
GROUP BY [Year], ColCode

我想把它放到一个触发器中,这样用户就不必考虑运行一个过程。

我已经开始了以下操作,但我不确定我是否走在正确的轨道上。我应该使用 FOR、AFTER 还是 INSTEAD OF?

CREATE TRIGGER TRIU_TableA 
ON TableA 
FOR INSERT,UPDATE AS

BEGIN
  SET NOCOUNT ON
  IF EXISTS (SELECT * FROM Inserted WHERE RowCode=111)
  BEGIN
    INSERT INTO TableA
    SELECT [Year], RowCode, ColCode, SUM(Amt) AS Amt
    FROM Inserted
    WHERE [Year]>=1998 AND RowCode IN (1,12,23) AND ColCode=14
    GROUP BY [Year], ColCode
  END

END

非常感谢任何有关如何解决此问题的帮助。

非常感谢
标记

【问题讨论】:

    标签: sql tsql sql-server-2008 triggers


    【解决方案1】:

    您忘记了删除部分。

    但是为什么您的应用程序不只是在每次插入/更新后自动运行现有的 proc?人们是否从查询窗口更新您的数据库?

    让它成为AFter触发器,After和For是一样的,但是after是新的语法。

    【讨论】:

      【解决方案2】:

      你应该使用FOR

      将触发器与存储过程进行比较,一切看起来都很好。

      你还有什么问题?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        相关资源
        最近更新 更多