SQLServer MERGE 用法
今天寫儲存過程的時候,遇到了從一個大json串中取一個id號比對,如果是存在的就更新,不存在就新增。查了資料,覺得還是用merge比較好,這個用法坑也不少,一起來看看程式碼吧。
MERGE tABatch AS t -- 需要操作的主體表
USING(
SELECT batchNo,COUNT(0) AS waitTotal
FROM (
SELECT batchNo FROM OPENJSON(@checkJson)
WITH(batchNo VARCHAR(50) '$.batchNo')
) t GROUP BY t.batchNo
) AS s (batchNo,waitTotal) -- USING裡面是資料來源,as以後,必須按照順序指定欄位名
ON t.batchNo = s.batchNo -- 這裡是對比的條件
WHEN MATCHED THEN
-- 如果有匹配就更新,只用寫要更新的內容即可
UPDATE SET t.waitTotal = t.waitTotal+s.waitTotal
WHEN NOT MATCHED THEN
-- 沒有匹配就新增,注意這裡的INSERT不能再跟表名了
INSERT
(
batchNo,
waitTotal,
createTime
)VALUES(
s.batchNo,
s.waitTotal,
getdate()
);
-- merge必須分號結尾,不然報錯
上面是我的示例,如果不放心可以來看看官方的:
CREATE PROCEDURE dbo.InsertUnitMeasure
@UnitMeasureCode nchar(3),
@Name nvarchar(25)
AS
BEGIN
SET NOCOUNT ON;
-- Update the row if it exists.
UPDATE Production.UnitMeasure
SET Name = @Name
WHERE UnitMeasureCode = @UnitMeasureCode
-- Insert the row if the UPDATE statement failed.
IF (@@ROWCOUNT = 0 )
BEGIN
INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name)
VALUES (@UnitMeasureCode, @Name)
END
END;
GO
-- Test the procedure and return the results.
EXEC InsertUnitMeasure @UnitMeasureCode = 'ABC', @Name = 'Test Value';
SELECT UnitMeasureCode, Name FROM Production.UnitMeasure
WHERE UnitMeasureCode = 'ABC';
GO
-- Rewrite the procedure to perform the same operations using the
-- MERGE statement.
-- Create a temporary table to hold the updated or inserted values
-- from the OUTPUT clause.
CREATE TABLE #MyTempTable
(ExistingCode nchar(3),
ExistingName nvarchar(50),
ExistingDate datetime,
ActionTaken nvarchar(10),
NewCode nchar(3),
NewName nvarchar(50),
NewDate datetime
);
GO
ALTER PROCEDURE dbo.InsertUnitMeasure
@UnitMeasureCode nchar(3),
@Name nvarchar(25)
AS
BEGIN
SET NOCOUNT ON;
-- 重點看這一段
MERGE Production.UnitMeasure AS target
USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)
ON (target.UnitMeasureCode = source.UnitMeasureCode)
WHEN MATCHED THEN
UPDATE SET Name = source.Name
WHEN NOT MATCHED THEN
INSERT (UnitMeasureCode, Name)
VALUES (source.UnitMeasureCode, source.Name)
OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;
END;
GO
-- Test the procedure and return the results.
EXEC InsertUnitMeasure @UnitMeasureCode = 'ABC', @Name = 'New Test Value';
EXEC InsertUnitMeasure @UnitMeasureCode = 'XYZ', @Name = 'Test Value';
EXEC InsertUnitMeasure @UnitMeasureCode = 'ABC', @Name = 'Another Test Value';
SELECT * FROM #MyTempTable;
-- Cleanup
DELETE FROM Production.UnitMeasure WHERE UnitMeasureCode IN ('ABC','XYZ');
DROP TABLE #MyTempTable;
GO
相關文章
- merge into 用法深思
- merge into基本用法
- SQLserver With As 用法SQLServer
- SQL中Merge的用法SQL
- SqlServer的with(nolock)的用法SQLServer
- merge sql error, dbType sqlserver, druid1.1.10, sql : nullSQLErrorServerUINull
- Sqlserver、oracle中Merge的使用方法,一個merge語句搞定多個Insert,Update,Delete操作SQLServerOracledelete
- Java 8 中 Map 騷操作之 merge() 的用法Java
- SQLserver-MySQL的區別和用法ServerMySql
- mssql sqlserver update delete表別名用法簡介SQLServerdelete
- 簡單介紹SQLserver中的declare變數用法SQLServer變數
- mssql sqlserver 關鍵字 GROUPING用法簡介及說明SQLServer
- Sqlserver的merge into或delete語句堵塞select語句,鎖型別是LCK_M_ISSQLServerdelete型別
- sql merge intoSQL
- Merge Or Rebase
- git mergeGit
- ou have not concluded your merge (MERGE_HEAD exists)
- git merge origin master git merge origin/master區別GitAST
- Polyphase Merge Sort
- git 中止mergeGit
- pandas merge報錯
- Java HashMap merge() 方法JavaHashMap
- Merge Two Sorted List
- 56. Merge Intervals
- 測試merge效率
- git merge失敗Git
- Merge語法限制
- Insertion Sort and Merge Sort
- git-----You have not concluded your merge (MERGE_HEAD exists)解決Git
- git rebase 和 git mergeGit
- [LeetCode] 721. Accounts MergeLeetCode
- lightdb -- merge into insert 相容 OracleOracle
- 88. Merge Sorted Array
- 1089 Insert or Merge (25分)
- 要命的MERGE JOIN CARTESIAN
- LSM merge的過程
- 詳解Map.merge()
- 使用分支——Git Merge命令Git