考慮使用派生表將 4 行合并到 Target 中的 SQL MERGE 陳述句,如下所示:
MERGE Target AS T USING
(VALUES
(?, ?, ?),
(?, ?, ?),
(?, ?, ?),
(?, ?, ?),
) as S(Account_ID,Device_ID,Device_Name)
ON T.Account_ID = S.Account_ID
WHEN MATCHED THEN UPDATE SET
Account_ID = S.Account_ID,
Device_ID = S.Device_ID,
Device_Name = S.Device_Name
WHEN NOT MATCHED THEN INSERT
(Account_ID,Device_ID,Device_Name)
VALUES (S.Account_ID,S.Device_ID,S.Device_Name)
OUTPUT $action, inserted.*;
輸出(插入行的)是否遵循派生表中指定的相同順序?例如,假設第 2 行和第 4 行已插入 Target。輸出結果是否保持與[2,4]相同的順序。
對于我執行的測驗,它似乎可以做到,但我找不到任何可靠的檔案。
如果它有幫助 Target 也有一個自動遞增的主鍵。
uj5u.com熱心網友回復:
上的檔案OUTPUT 明確指出:
無法保證將更改應用于表的順序與將行插入到輸出表或表變數中的順序一致。
這是完全合理的,因為永遠無法保證任何查詢或 DML 的執行方式。只要語意相同,編譯器就可以自由地重新排序或并行化。
更重要的是:MERGE本身不保證以任何特定順序插入或更新。這與任何聚集或非聚集索引、主鍵或IDENTITY列無關。
uj5u.com熱心網友回復:
正如許多回復所指出的那樣,MERGE 操作不保證對插入的行進行任何排序。
但是,此處概述的方法適用于我的用例,方法是為行指定增量索引 (SourceId),然后執行一些記憶體中處理(在我的 NodeJS 代碼中)以按 SourceId 對 OUTPUT 回應進行排序。
MERGE Target AS T USING
(VALUES
(1, ?, ?, ?),
(2, ?, ?, ?),
(3, ?, ?, ?),
(4, ?, ?, ?),
) as S(SourceId, Account_ID,Device_ID,Device_Name)
ON T.Account_ID = S.Account_ID
WHEN MATCHED THEN UPDATE SET
Account_ID = S.Account_ID,
Device_ID = S.Device_ID,
Device_Name = S.Device_Name
WHEN NOT MATCHED THEN INSERT
(Account_ID,Device_ID,Device_Name)
VALUES (S.Account_ID,S.Device_ID,S.Device_Name)
OUTPUT $action, S.SourceId, inserted.*;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343710.html
標籤:sql sql-server 查询语句 sql合并
下一篇:解碼一個sql函式
