2016-03-07 76 views
0

這個目前的工作,但我想更改更新聲明,以包括在它下面的插入的行爲,是否可行?如何正確地將這2個查詢合併爲一個更新?

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) 
+0

是的,這是可能的。它被稱爲['MERGE'](https://msdn.microsoft.com/en-us/library/bb510625.aspx)。 – lad2025

+0

我不明白@Fredou如何通過MERGE語句獲得他想要的內容。 –

+0

@ lad2025我目前正在尋找合併,我還不確定如何做到這一點與表提示和皮卡行被鎖定,沒有找到,目前我只做一個通用檢查 – Fredou

回答

0

我不認爲你想要什麼是可能的。

  • 您從一張表開始更新。假設這個表格包含一組ID,例如1到6
  • 您加入到包含可能部分重疊的不同ID集(例如4到9)的臨時表中
  • 您使用內部聯接。只更新第4到第6行
  • 輸出子句僅爲修改的行選取數據,因此您只能獲得第4到第6行的數據
  • 如果將其翻轉到外部聯接(使所有臨時錶行都是你仍然只更新第4行到第6行,輸出子句仍然只是爲第4行到第6行啓動數據。

所以,不,我沒有辦法在單個SQL語句中實現這個目標。

+0

這就是當我嘗試使用不同類型的連接更新時看到的行爲,我目前正在尋找合併並且不確定,就像你說的,如果可能的話。 – Fredou