条件匹配时使用SQL Merge语句插入多行

条件匹配时使用SQL Merge语句插入多行,sql,sql-server,sql-merge,Sql,Sql Server,Sql Merge,具有非标识主键的表。所以,每当我们插入新记录时,我们也必须传递主键 当记录不匹配时,我必须使用Merge语句插入上表。但问题是我不能为每次插入增加主键。不能在主键列中插入重复项。 请在下面找到合并查询示例 是否可以通过增量主键插入多行 MERGE DBO.Table1 T1 USING (DBO.Table2 )T2 ON (T1.ID = T2.ID) WHEN MATCHED THEN UPDATE SET

具有非标识主键的表。所以,每当我们插入新记录时,我们也必须传递主键

当记录不匹配时,我必须使用Merge语句插入上表。但问题是我不能为每次插入增加主键。不能在主键列中插入重复项。 请在下面找到合并查询示例

是否可以通过增量主键插入多行

MERGE DBO.Table1 T1
        USING (DBO.Table2 )T2
        ON (T1.ID = T2.ID)
        WHEN MATCHED
            THEN UPDATE SET 
            T1.CURVE = T2.CURVE
        WHEN NOT MATCHED
            THEN INSERT (ID, CURVE )
            Values ( T2.ID, T2.CURVE);

示例中的代码很有效,下面是一个易于复制的演示

;with cteT as ( SELECT * FROM (VALUES (1,'T1 Val 1') , (2,'T1 Val 2') , (4,'T1 Val 4') ) as T1(ID, Curve)
)SELECT * INTO #Dest FROM cteT

;with cteT as ( SELECT * FROM (VALUES (3,'T2 Val 3') , (4,'T2 Val 4') , (5,'T2 Val 5') ) as T1(ID, Curve)
)SELECT * INTO #Srce FROM cteT;

MERGE INTO #Dest as T1
USING #Srce as T2 ON T1.ID=T2.ID
    WHEN MATCHED THEN UPDATE SET T1.Curve=T2.CURVE
    WHEN NOT MATCHED BY TARGET 
        THEN INSERT (ID, Curve) VALUES(T2.ID, T2.Curve)
;

SELECT * FROM #Dest ORDER BY ID

DROP TABLE #Dest
DROP TABLE #Srce
这是输出,注意1和2的值不变,4的值从T2更新,3和5的值从T2插入

ID  Curve
1   T1 Val 1
2   T1 Val 2
3   T2 Val 3
4   T2 Val 4
5   T2 Val 5
这意味着最有可能的问题是T2.ID的值有问题,或者您的示例太过精简,并且遗漏了实际代码中的复杂内容。我首先在T2.ID中检查您的数据

SELECT ID, COUNT(ID) as IDCount FROM DBO.Table2 GROUP BY ID HAVING COUNT(*) > 1
SELECT * FROM DBO.Table2 WHERE ID IS NULL

看看有没有记录。如果这两个都是空的,请查看实际的合并代码,看看它与您发布的代码有何不同。如果您发布更新的示例代码,我将尝试查看。

您的RDBMS(MS Sql、Oracle等)是什么?@DmitryBychenko它是MS SQLFirst,您在T2.ID上合并,但插入值(T2.ProductID…,这是一个输入错误吗?如果不是,这可能是您的问题,这并没有说明T2.ProductID是否已经存在。其次,您确定T2.ID吗(或ProductID)满足主键(唯一、非空)的要求?@RobertSheahan抱歉,这是我的错误。它是T2.ID。是的,如果条件匹配,则匹配的行将被更新,但对于那些条件不匹配的行,我将无法插入重复错误。希望我回答了您的查询。如果您需要更多详细信息,请让我知道。