使用 MERGE 在单个语句中对表执行 INSERT 和 UPDATE 操作
发布时间:2020-12-31 00:54:46 所属栏目:MySql教程 来源:网络整理
导读:以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 USE AdventureWorks2012;GOCREATE PROCEDURE dbo.InsertUnitMeasure @UnitMeasureCode nchar(3),@Name nvarchar(25)AS BEGIN SET NOCOUNT ON;-- Update the row if i
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 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 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |