SQLServer 2008 UPSERT合并而不重复值

时间:2016-02-08 06:32:45

标签: sql-server

我创建了一个伪UPSERT语句,但是由于要插入或更新的数据可能非常大,为了减少网络带宽,我想只定义要更新或插入的数据一次。

为简洁起见,在我的例子中,我只包含2个字段,并且两者都有非常短的数据长度,但在实际系统中可能有数十个字段,其中一些字段可能很长。

MERGE PART AS T 
USING (SELECT ID) AS S 
ON(S.ID = T.ID) 
WHEN MATCHED THEN UPDATE SET ID='ABCD-000',DESCRIPTION='NEW DESCRIPTION' 
WHEN NOT MATCHED THEN INSERT (ID,DESCRIPTION) VALUES('ABCD-000','NEW DESCRIPTION');

在此示例中,ID是唯一的,如果存在,则应更新,如果不存在,则应插入新记录。

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

MERGE PART AS T 
USING (
    SELECT
        'ABCD-000' as ID,
        'NEW DESCRIPTION' NewDescription
    ) AS S
ON (S.ID = T.ID)
WHEN MATCHED THEN UPDATE SET T.DESCRIPTION=S.NewDescription
WHEN NOT MATCHED THEN INSERT (ID,DESCRIPTION) VALUES(S.ID, S.NewDescription);

此外,由于您的数学条件已为SET ID='ABCD-000',因此无需WHEN MATCHED THEN UPDATE S.ID = T.ID {/ 1}}。