0

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

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)
4

1 回答 1

0

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

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

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

于 2016-03-07T15:16:51.643 回答