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

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SQL Server中的MERGE INTO语句用于将数据从一个表合并到另一个表中。它可以根据指定的条件更新或插入数据。MERGE INTO语句需要指定源表和目标表,并且需要指定用于匹配行的列。然后,您可以指定要执行的操作,例如更新、插入或删除。MERGE INTO语句可以帮助您更有效地管理数据,并减少编写复杂SQL语句的需要。 ### 回答2: SQL Server中的MERGE INTO语句是一种有用的功能,可以在两个或更多表中进行数据合并(插入、更新或删除)。这个语句结合了INSERT、UPDATE和DELETE语句的功能,使得在进行数据合并时更加的方便,同时避免了执行三个不同语句时可能遇到的一些问题。 首先,MERGE INTO语句的基本语法如下: ``` MERGE INTO targetTable USING sourceTable ON joinCondition WHEN MATCHED THEN UPDATE SET targetColumn = sourceColumn WHEN NOT MATCHED THEN INSERT (targetColumn1, targetColumn2, ...) VALUES (sourceColumn1, sourceColumn2, ...) ``` 这个语句由两个部分组成:源表和目标表。使用表之前必须先定义好JOIN过程,包括定义表之间的关系和匹配条件。当匹配时,在目标表中更新相应的列,否则插入一个新的行。此外,MERGE INTO还有一些其他的参数可以使用,如DELETE语句等。 要使用MERGE INTO语句进行数据合并,首先需要确保源表和目标表具有相同的列名和数据类型,以确保数据可以正确合并。其次,需要确保在执行MERGE INTO语句之前已经关闭了对目标表的所有约束和触发器,这样可以避免在合并数据时发生错误。最后,需要注意MERGE INTO语句执行顺序,首先执行DELETE操作,然后执行UPDATE操作,最后执行INSERT操作。 使用MERGE INTO语句进行数据合并可以大大简化SQL Server数据库管理的工作。使用它可以减少需要编写的代码数量,并在同时执行多个操作时提供了更高效的方法。此外,MERGE INTO还可以让开发人员更加容易地维护代码,以实现更好的可读性和可重用性。综上所述,使用MERGE INTO语句进行数据合并是一种非常有用和重要的SQL Server数据库管理方法。 ### 回答3: SQL Server的Merge语句是一种相对较新的聚合语句。它的主要作用是将源表的数据合并到目标表中,同时实现插入、更新、删除数据的操作。使用SQL Server Merge语句可以有效简化重复插入、删除和更新的操作,也可以根据需要执行多个操作。 使用SQL Server Merge语句时,首先需要指定目标表,或已存在的一个命名聚合表,表中包含需要更新、插入或删除的记录。接着,需要指定“合并规则”,即当源数据与目标数据之间存在冲突时如何处理。合并规则通常包括以下几种情况: 1. 目标表中有而源表中没有的数据,需要插入。 2. 源表和目标表中都存在的数据,需要根据匹配键进行更新。 3. 目标表中有而源表中没有的数据,需要删除。 4. 源表和目标表都存在的数据,但是在目标表中被标记为“已删除”,需要恢复。 对于每个规则,可以指定相应的SQL语句。例如,当源表和目标表中都存在的数据需要更新时,可以使用UPDATE语句。如果目标表中有但源表中没有的数据需要插入,则可以使用INSERT语句。 总的来说,SQL Server Merge语句使得数据合并操作更加高效和易于管理。但需要注意的是,Merge语句需要仔细测试和验证,以确保它能够正确地执行所需的操作,并避免数据的丢失或冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值