具有非标识主键的表。因此,每当我们插入新记录时,我们也必须传递主键。
当使用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);发布于 2020-01-16 23:25:14
示例中的代码可以正常工作,下面是一个易于重现的演示
;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看看有没有什么记录。如果这两个都是空的,请查看您的实际合并代码,看看它与您发布的代码有何不同。如果你更新了示例代码,我会试着去看看。
https://stackoverflow.com/questions/59770856
复制相似问题