2

我有两张桌子

第一个表 Listexecutionaction 由 no 组成。的行动。表结构如下

QueueId  ActionId  Executed
135      44         1
135      45         1
135      46         1
135      47         1
135      48         1

第二个表 Listqueue 包含已完成的全部操作的摘要。结构如下

DDBMSKEY    NoOfActivities   Completed
135         5                3

我的要求是对于 Listexecutionaction 表上的每个插入和更新,它应该计算 NoOfActivities 和完成的操作数。为此,我在 Listexecutionaction 的表上编写了触发器,如下所示。

ALTER TRIGGER [Common].[ActivityStatus_AfterInsertUpdate] ON  [Common].[ListExecutionAction] AFTER Insert,Update
AS 
BEGIN
    UPDATE COMMON.LISTQUEUE   
    SET 
        NOOFACTIVITIES=
                    (SELECT count(ID) FROM common.listexecutionaction WHERE queueid=lstact.queueid),
        Completed=
                    (SELECT count(ID) FROM common.listexecutionaction WHERE queueid=lstact.queueid And Executed=1)
    FROM common.listqueue lstqueue left join common.listexecutionaction lstact 
    ON lstqueue.DDBMSKey= lstact.queueid 
    WHERE lstqueue.DDBMSKey in (Select queueid from Inserted)

END

我想要的表 Listqueue 的输出应该如下

DDBMSKEY  NoOfActivities  Completed
135       5               5

但有时触发器正在计算错误的结果。完成的动作并给出结果为

DDBMSKEY  NoOfActivities  Completed
135       5               3

请提出触发器中有什么问题。有时它工作正常,有时会失败。我想同时触发插入和更新

4

1 回答 1

0

您的查询似乎可以简化为:

ALTER TRIGGER [Common].[ActivityStatus_AfterInsertUpdate] 
    ON  [Common].[ListExecutionAction] AFTER Insert,Update
    AS 
    BEGIN
        UPDATE COMMON.LISTQUEUE   
        SET 
            NOOFACTIVITIES=
                        (SELECT count(ID) 
                         FROM common.listexecutionaction 
                         WHERE queueid=lstact.queueid),
            Completed=
                        (SELECT count(ID) 
                         FROM common.listexecutionaction 
                         WHERE queueid=lstact.queueid And Executed=1)
        WHERE lstqueue.DDBMSKey in (Select queueid from Inserted)

    END

我认为这不会解决问题,至少查询更短。

于 2013-02-13T16:00:09.447 回答