Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中插入新记录并更新更改的记录_Sql Server - Fatal编程技术网

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”,并检查每列的值。请记住,如果要捕获字符串值的大小写更改,可能必须在检查中使用区分大小写的排序规则。可能存在重复的