视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
使用MERGE在单个语句中对表执行INSERT和UPDATE操作
2020-11-09 16:13:09 责编:小采
文档

一种常见的应用场景是在存在匹配行时更新表中的一个或多个列,或在不存在匹配行时将数据作为新行插入。 此操作一般通过将参数传递给包含相应 UPDATE 和 INSERT 语句的存储过程来执行。 借助 MERGE 语句,将可以在单个语句中一起执行这两项任务。 下面的示例

一种常见的应用场景是在存在匹配行时更新表中的一个或多个列,或在不存在匹配行时将数据作为新行插入。 此操作一般通过将参数传递给包含相应 UPDATE 和 INSERT 语句的存储过程来执行。 借助 MERGE 语句,将可以在单个语句中一起执行这两项任务。 下面的示例显示了一个同时包含 INSERT 语句和 UPDATE 语句的存储过程。 随后,此示例对该过程进行了修改,以使用单个 MERGE 语句执行等效的操作。 <无> $velocityCount-->
USE AdventureWorks2012;
GO
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

下载本文
显示全文
专题