Sql server sqlserver2008中的合并查询

Sql server sqlserver2008中的合并查询,sql-server,merge,Sql Server,Merge,我有一个将数据从源表加载到目标表的场景。如果源中的数据不在目标中,那么我需要插入。如果目标表中已经存在该列,则将该行的状态更新为“expire”,并将该列作为新行插入。我使用合并查询来实现这一点。我可以做插入,如果不存在,我也可以做更新。但当尝试在匹配时插入时,它表示在“匹配时”子句中不允许插入。 请帮帮我。。提前感谢查看以下众多链接之一: 如果不知道您的数据库表是什么样子的,我们就帮不上什么忙了-您需要阅读这些文章并弄清楚如何将其应用于具体情况。如果您想对一行源数据执行多个操作,您

我有一个将数据从源表加载到目标表的场景。如果源中的数据不在目标中,那么我需要插入。如果目标表中已经存在该列,则将该行的状态更新为“expire”,并将该列作为新行插入。我使用合并查询来实现这一点。我可以做插入,如果不存在,我也可以做更新。但当尝试在匹配时插入时,它表示在“匹配时”子句中不允许插入。
请帮帮我。。提前感谢

查看以下众多链接之一:


如果不知道您的数据库表是什么样子的,我们就帮不上什么忙了-您需要阅读这些文章并弄清楚如何将其应用于具体情况。

如果您想对一行源数据执行多个操作,您需要以某种方式复制该行

类似于以下内容(组成表名等):

您总是希望在不匹配的分支中使用s.Dupl条件,否则将插入两次与任何目标行都不匹配的源行


根据您作为评论发布的示例,我将更改:

MERGE target AS tar USING source AS src ON src.id = tar.id
WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate
WHEN NOT MATCHED THEN INSERT (col1,col2,col3) VALUES (tar.col1,tar.col2,tar.col3); 
进入:


我已经更改了
values
子句中的值,因为在一个不匹配的分支中,tar表没有可以从中选择值的行。

向我们展示您已经拥有的!!解释一下你的桌子是什么样子的!!'当我第一次来插入数据时,可以执行“WHEN NOT MATCHED”。在下一次,当数据存在时,它将执行更新,并为您希望我使用之前声明的相同“when NOT MATCHED”子句执行插入操作。。。是合并不允许2'WHEN NOT MATCHED'子句。我能做些什么区分“不匹配时”和“不匹配时”吗clause@user549903-我不知道你现在想要什么。在我显示的语句中,如果目标表中有匹配的行,则更新和插入都将发生。匹配时,使用源作为src ON src.id=tar.id将目标合并为tar,然后更新集D_VALID_TO=@nowdate-1,C_IS_ACTIVE='N',D_LAST_UPDATED_DATE=@nowdate,如果不匹配,则插入(col1,col2,col3)值(tar.col1,tar.col2,tar.col3);根据我的要求,如果匹配,则需要进行更新和插入。如果不匹配,则只需执行insertDamien,非常感谢您的帮助..它会更新行。但匹配时不会插入行。
MERGE target AS tar USING source AS src ON src.id = tar.id
WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate
WHEN NOT MATCHED THEN INSERT (col1,col2,col3) VALUES (tar.col1,tar.col2,tar.col3); 
;WITH SourceDupl AS (
    SELECT id,col1,col2,col3,t.Dupl
    FROM source,(select 0 union all select 1) t(Dupl)
)
MERGE target AS tar USING SourceDupl as src on src.id = tar.id AND Dupl=0
WHEN MATCHED THEN UPDATE SET D_VALID_TO=@nowdate-1, C_IS_ACTIVE='N', D_LAST_UPDATED_DATE=@nowdate
WHEN NOT MATCHED AND Dupl=1 THEN INSERT (col1,col2,col3) VALUES (src.col1,src.col2,src.col3);