【发布时间】:2016-11-14 16:46:42
【问题描述】:
我一直在尝试编写一个存储过程,我可以在其中使用带有以下条件的 Merge 执行 UpSert
如果记录存在,则将目标的结束日期更改为昨天,即今天 - 1
如果记录不存在,则插入新记录
这是我在 SP 中使用的表 tblEmployee
CREATE TABLE tblEmployee
(
[EmployeeID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](10) NOT NULL,
[StartDate] [date] NOT NULL,
[EndDate] [date] NOT NULL
)
这是我的以 UDTT 作为输入参数的 SP
CREATE PROCEDURE [dbo].[usp_UpsertEmployees]
@typeEmployee typeEmployee READONLY -- It has same column like tblEmployye except EmployeeID
AS
BEGIN
SET NOCOUNT ON;
MERGE INTO tblEmployee AS TARGET
USING @typeEmployee AS SOURCE
ON TARGET.Name = SOURCE.Name
WHEN MATCHED and TARGET.StartDate < SOURCE.StartDate
THEN
--First Update Existing Record EndDate to Previous Date as shown below
UPDATE
set TARGET.EndDate = DATEADD(day, -1, convert(date, SOURCE.StartDate))
-- Now Insert New Record
--INSERT VALUES(SOURCE.Name, SOURCE.StartDate, SOURCE.EndDate);
WHEN NOT MATCHED by TARGET
THEN
INSERT VALUES(SOURCE.Name, SOURCE.StartDate, SOURCE.EndDate);
SET NOCOUNT OFF;
END
当列匹配时,我如何执行更新现有记录和添加新记录
请有人解释一下 TSQL 中合并的执行流程,即,
WHEN MATCHED --Will this Execute Everytime
WHEN NOT MATCHED by TARGET -- Will this Execute Everytime
WHEN NOT MATCHED by SOURCE -- Will this Execute Everytime
Merge 中每次都会执行以上 3 个条件还是每次只执行匹配条件
提前致谢
【问题讨论】:
-
when matched then begin /* update and insert here */ end... -
出现编译错误“'Begin' 附近的语法不正确。需要 DELETE、INSERT 或 UPDATE。
-
好吧,我想我错了……
标签: sql-server stored-procedures sql-server-2014 sql-merge