Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server触发器与CTE一起在插入后更新另一个字段_Sql_Sql Server_Triggers - Fatal编程技术网

SQL Server触发器与CTE一起在插入后更新另一个字段

SQL Server触发器与CTE一起在插入后更新另一个字段,sql,sql-server,triggers,Sql,Sql Server,Triggers,我创建了一个触发器,用于在插入后更新列。我遇到的问题是,IsNowComplete CTE似乎无法处理包含多个项目的多个拾取列表。我如何解释这种情况?我的触发器的代码: AFTER INSERT, UPDATE AS WITH WasComplete AS ( SELECT pl.IsComplete, pl.Id FROM dbo.PickList pl JOIN

我创建了一个触发器,用于在插入后更新列。我遇到的问题是,IsNowComplete CTE似乎无法处理包含多个项目的多个拾取列表。我如何解释这种情况?我的触发器的代码:

AFTER INSERT, UPDATE
AS
    WITH WasComplete AS 
    (
        SELECT  
            pl.IsComplete, pl.Id
        FROM    
            dbo.PickList pl
        JOIN    
            inserted i ON pl.Id = i.PickListId
    ), IsNowComplete AS 
    (
       SELECT   
           i.PickListId, 
           IsNowComplete = CASE 
                              WHEN COUNT(1) > 0 THEN 0 ELSE 1
                           END
       FROM 
           dbo.PickListContent plc
       JOIN 
           inserted i ON plc.PickListId = i.PickListId 
       WHERE    
           plc.PickListId = i.PickListId
           AND plc.QuantityPicked != plc.QuantityNeeded
       GROUP BY
           i.PickListId
    )
    UPDATE pl
    SET IsComplete = CASE 
                         WHEN ws.IsComplete = 0 AND inc.IsNowComplete = 1 
                           THEN 1
                         WHEN ws.IsComplete = 1 AND inc.IsNowComplete = 0 
                           THEN 0
                         ELSE 
                           ws.IsComplete 
                     END
    FROM dbo.PickList pl
    JOIN WasComplete ws ON pl.Id = ws.Id
    JOIN IsNowComplete inc ON ws.Id = inc.PickListId
END

请将现在不完整的WHERE条款修改为

和plc.QuantityChecked不存在选择plc1.QuantityRequired from dbo.PickListContent plc1

如果没有空值,也可以使用NOT IN


希望这能有所帮助。

这里是一个很好的起点。我看到你在做一个没有分组依据的COUNT1,这可能是一个错误,但因为我不知道你的数据、当前结果或期望的结果,我不知道应该是什么。我注意到我在发布后没有分组依据。我编辑了上面的声明。谢谢仍在寻找如何解释可能包含来自inserted的多个项目的多个拾取列表。@AudiDriver您的WASSOMPLETE查询将inserted中的多个记录视为一个表,并包括insert/update中包含的所有拾取列表。在这里,我将对pl.IsComplete、pl.Id执行一个groupby,以防inserted包含相同PickListId的多个记录。您的IsComplete查询似乎只有一半好,因为它正确地将inserted视为一个表,并且有一个group by返回在此insert/update中受影响的唯一选取列表,但是任何在picklistcontent中没有记录的选取列表都不会被包括在内,并且将从update语句中跳过。@谢谢您的建议。将GROUP BY与IsNowComplete CTE一起添加到WasComplete CTE似乎解决了我的问题。如果picklistcontent中不存在记录,我不想执行更新。