Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从datatable复制新记录并识别旧记录中的更改_Sql_Sql Server_Sql Server 2008_Remote Server - Fatal编程技术网

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);