如何正确地将这两个查询合并为一个更新?

how to properly merge these 2 query into one update?

这目前有效,但我想更改更新语句以包括在其下方插入的操作,这可能吗?

UPDATE cas
    SET [Locked] = CASE WHEN cas.Locked <> @TargetState AND cas.LastChanged = filter.SourceDateTime THEN @TargetState ELSE cas.[Locked] end,
    OUTPUT inserted.Id, inserted.Locked, CASE WHEN inserted.Locked = @TargetState AND 
                                                   inserted.LastChanged = filter.SourceDateTime THEN 1 
                                              WHEN inserted.LastChanged <> filter.SourceDateTime THEN -1 -- out of sync
                                              WHEN deleted.Locked = @TargetState THEN -2 -- was not in a good state
                                              ELSE 0 END --generic failure
    INTO @OUTPUT
    FROM dbo.Target cas WITH(READPAST, UPDLOCK, ROWLOCK) INNER JOIN  @table filter ON cas.Id = filter.Id 

INSERT INTO @OUTPUT
SELECT filter.id, NULL, when cas.id is not null -3 --  row was/is locked
                                           else -4 end --not found 
FROM  @table filter left join dbo.target cas with(nolock) on filter.id = cas.id
WHERE NOT EXISTS (SELECT 1 FROM @OUTPUT result WHERE filter.id = result.UpdatedId)

我不认为你想要的是可能的。

  • 您从 table 开始更新。假设这个 table 包含一组 ID,比如 1 到 6
  • 您加入的临时 table 包含一组不同的 ID,这些 ID 可能部分重叠(例如,4 到 9)
  • 您使用内部联接发出更新。仅更新第 4 至 6 行
  • 输出子句只获取修改行的数据,所以你只获取第 4 到 6 行的数据
  • 如果将其翻转为外连接(这样所有临时 table 行都被选中),您仍然只更新第 4 行到第 6 行,输出子句仍然只踢出第 4 行到第 6 行的数据6

所以,不,我认为没有办法在一个 SQL 声明中实现这个目标。