Sql 从datatable复制新记录并识别旧记录中的更改
假设有两个表:Sql 从datatable复制新记录并识别旧记录中的更改,sql,sql-server,sql-server-2008,remote-server,Sql,Sql Server,Sql Server 2008,Remote Server,假设有两个表:Remote\u table和My\u table Remote_表有6列: PROJECT JOB_TYPE MONTH YEAR** HOURS IS_DELETED 134393 70 1 2013 30 0 134393 70 2 2013 50 0 134393 70 3 2013 80
Remote\u table
和My\u table
Remote_表
有6列:
PROJECT JOB_TYPE MONTH YEAR** HOURS IS_DELETED
134393 70 1 2013 30 0
134393 70 2 2013 50 0
134393 70 3 2013 80 0
134393 70 10 2012 10 0
134393 70 11 2012 0 0
134393 70 12 2012 15 0
My\u table
是remote\u table
的副本
我试图通过此查询仅复制远程\u表中的新记录:
SELECT *
FROM [remote_DB].[LudanProjectManager].[dbo].Remote_table
EXCEPT
SELECT *
FROM My_table
它工作正常,但在小时数列的remote\u表
上进行更改时,会出现重复的主键异常
是否有人能想出一种方法,仅从远程\u表
复制新记录,如果对旧记录进行了更改,则识别它们并更新我的\u表
,使之对应?识别新记录:
SELECT * FROM [remote_DB].[LudanProjectManager].[dbo].Remote_table RT
WHERE NOT EXISTS
(
SELECT 1 FROM My_table MT WHERE MT.PROJECT=RT.PROJECT
)
确定变化:
SELECT * FROM [remote_DB].[LudanProjectManager].[dbo].Remote_table RT
INNER JOIN My_table MT ON RT.PROJECT=MT.PROJECT
WHERE RT.JOB_TYPE <> MT.OB_TYPE
OR RT.MONTH <> MT.MONTH
OR RT.YEAR <> MT.YEAR
OR RT.HOURS <> MT.HOURS
OR RT.IS_DELETED <> MT.IS_DELETED
从[remote\u DB].[LudanProjectManager].[dbo].remote\u table RT中选择*
RT.PROJECT=MT.PROJECT上的内部联接My_表MT
其中RT.JOB\U类型MT.OB\U类型
或RT月MT月
或RT.YEAR MT.YEAR
或RT.HOURS MT.HOURS
或RT.IS_删除MT.IS_删除
由于您使用的是SQL Server 2008,您可以使用:
请注意:
- 匹配行和不匹配行是根据
on
子句中指定的编码确定的,可能是您需要使用额外条件、TGT.Year=SRC.TGT、…
限制匹配行,或者仅使用on TGT.PROJECT=SRC.PROJECT
在项目
字段上匹配
- 必须用分号结束
MEREGE
语句。这是强制性的
- 在
INSERT
语句中,TableName
中没有,因为目标表的名称已在MERGE
子句中定义
试试这个:
MERGE INTO My_table T
USING
Remote_table R
ON T.PROJECT = R.PROJECT
WHEN MATCHED THEN
UPDATE SET
T.JOB_TYPE=R.JOB_TYPE
T.MONTH =R.MONTH
T.YEAR =R.YEAR
T.HOURS =R.HOURS
T.IS_DELETED=R.IS_DELETED
WHEN NOT MATCHED THEN
INSERT (T.PROJECT,T.JOB_TYPE,T.MONTH,T.YEAR,T.HOURS,T.IS_DELETED)
VALUES (R.PROJECT,R.JOB_TYPE,R.MONTH,R.YEAR,R.HOURS,R.IS_DELETED);
您可以尝试Upsert或Merge语句。也许您应该使用“exist in”而不是EXCEPT。EXCEPT命令比较所有列,这就是为什么当小时列中有更新时,您会得到重复的键。在这里,当匹配时,他必须更新,当不匹配时,作为新的插入record@AnandPhadke对不起,我错过了。现在修好了
MERGE INTO My_table T
USING
Remote_table R
ON T.PROJECT = R.PROJECT
WHEN MATCHED THEN
UPDATE SET
T.JOB_TYPE=R.JOB_TYPE
T.MONTH =R.MONTH
T.YEAR =R.YEAR
T.HOURS =R.HOURS
T.IS_DELETED=R.IS_DELETED
WHEN NOT MATCHED THEN
INSERT (T.PROJECT,T.JOB_TYPE,T.MONTH,T.YEAR,T.HOURS,T.IS_DELETED)
VALUES (R.PROJECT,R.JOB_TYPE,R.MONTH,R.YEAR,R.HOURS,R.IS_DELETED);