Sql server 在SQL Server中插入新记录并更新更改的记录
我在Sql server 在SQL Server中插入新记录并更新更改的记录,sql-server,Sql Server,我在SQL Server中有一个表,如果值已更改,我希望插入新记录或更新记录。merge命令似乎已关闭,但如果记录已存在,则无论发生什么情况,它都将更新该记录。我希望找到的功能是,如果源的每一列都与目标相同,则“跳过” 以下是一个例子: CREATE TABLE #Clients ( ClientID int PRIMARY KEY, FirstName varchar(20), InsertedDate datetime default getdate(), M
SQL Server
中有一个表,如果值已更改,我希望插入新记录或更新记录。merge
命令似乎已关闭,但如果记录已存在,则无论发生什么情况,它都将更新该记录。我希望找到的功能是,如果源的每一列都与目标相同,则“跳过”
以下是一个例子:
CREATE TABLE #Clients (
ClientID int PRIMARY KEY,
FirstName varchar(20),
InsertedDate datetime default getdate(),
ModifiedDate datetime default getdate()
);
INSERT INTO #Clients (ClientID, FirstName)
VALUES (1, 'Fred'), (2, 'Barney'), (3, 'Betty');
CREATE TABLE #Source (
ClientID int PRIMARY KEY,
FirstName varchar(20),
InsertedDate datetime default getdate(),
ModifiedDate datetime default getdate()
);
INSERT INTO #Source (ClientID, FirstName)
VALUES (1,'Fred'), (2, 'Fred Jr.'), (4, 'Wilma');
USE tempdb;
GO
BEGIN TRAN;
MERGE #Clients AS C
USING #Source AS S ON (C.ClientID = S.ClientID)
WHEN NOT MATCHED BY TARGET
THEN INSERT(ClientID, FirstName) VALUES(S.ClientID, S.FirstName)
WHEN MATCHED
THEN UPDATE SET C.FirstName = S.FirstName, ModifiedDate = GETDATE()
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT $action, inserted.*, deleted.*;
GO
有没有一种方法可以写入此命令,以便仅在记录发生更改时更新记录?要执行此操作,您必须编写自己的“upsert”,并检查每列的值。请记住,如果要捕获字符串值的大小写更改,可能必须在检查中使用区分大小写的排序规则。可能存在重复的