Sql 将一个表中的记录插入到另一个增加id的表中

Sql 将一个表中的记录插入到另一个增加id的表中,sql,sql-server,Sql,Sql Server,如何将一个表(表1)中的记录插入不同SQL数据库中的同一个表(表2) 但是,目标表已经存在,并且具有相同id(c1)的记录。表1的记录必须添加到表2中,但我必须增加字段(c1) 表1 C1;C2;C3; 1;Name 1;Address 1; 2;Name 2;Address 2; 3;Name 3;Address 3; 4;Name 4;Address 4; 表2 C1;C2;C3 ; 1;Name 11;Address 11; 2;Name 12;Address 12; 3;Name 13

如何将一个表(表1)中的记录插入不同SQL数据库中的同一个表(表2)

但是,目标表已经存在,并且具有相同id(c1)的记录。表1的记录必须添加到表2中,但我必须增加字段(c1)

表1

C1;C2;C3;
1;Name 1;Address 1;
2;Name 2;Address 2;
3;Name 3;Address 3;
4;Name 4;Address 4;
表2

C1;C2;C3 ;
1;Name 11;Address 11;
2;Name 12;Address 12;
3;Name 13;Address 13;
4;Name 14;Address 14;
5;Name 1;Address 1;
6;Name 2;Address 2;
7;Name 3;Address 3;
8;Name 4;Address 4;
怎么了? 表cl在两个数据库中都是相同的,如下列所示: (clstamp、nome、no、estab、vendnm、ncont)


如果您的数据库位于同一台服务器上,并且表2的C1列标记为标识列,则通常可以执行简单的SQL语句:

INSERT INTO database2..table2(C2, C3)
SELECT C2, C3
FROM database1..table1
ORDER BY C1 ASC

如果要避免插入重复行,请尝试以下操作:

INSERT INTO database2..myTable2 (C2, C3)
        select t1.c2, t1.c3
          FROM         [database1]..[table1] t1
          LEFT JOIN    [database2]..[table2] t2 ON t1.C2 = t2.C2 and t1.C3 = t2.C3
        where t2.c2 is null and t2.c3 is null
        order by t1.C1
如果你同意复制品,那么Angelo已经提到了解决方案

我尝试使用临时表,工作代码如下:

IF (OBJECT_ID('tempdb..#myTable1') IS NOT NULL)
BEGIN
   DROP TABLE #myTable1
END;

IF (OBJECT_ID('tempdb..#myTable2') IS NOT NULL)
BEGIN
   DROP TABLE #myTable2
END;

CREATE TABLE #myTable1 ([C1] int identity(1,1), [C2]  varchar(10),  [C3]  varchar(10));

CREATE TABLE #myTable2 ([C1] int identity(1,1), [C2]  varchar(10),  [C3]  varchar(10));

Insert INTO #myTable1(C2, C3)
values
 ('Name 1', 'Address 1')
, ('Name 2', 'Address 2')
, ('Name 3', 'Address 3')
, ('Name 4', 'Address 4')

Insert INTO #myTable2(C2, C3)
values
  ('Name 11', 'Address 11')
, ('Name 12', 'Address 12')
, ('Name 13', 'Address 13')
, ('Name 14', 'Address 14')

select * from #myTable1
select * from #myTable2

INSERT INTO #myTable2 (C2, C3)
    select t1.c2, t1.c3
      FROM         [#myTable1] t1
      LEFT JOIN    [#myTable2] t2 ON t1.C2 = t2.C2 and t1.C3 = t2.C3
    where t2.c2 is null and t2.c3 is null
    order by t1.C1

select * from #myTable2

如果您没有手动添加任何设置,如
IDENTITY\u INSERT
,则插入的所有记录自然都会被授予增量ID

正如您所描述的,这里的问题是违反主键约束的重复记录

最直接的方法是使用
MERGE
语句。
使用表1合并到表2
匹配时
不执行任何操作,在
不匹配时插入记录


另外,请注意,如果您
删除
任何记录,则删除的ID将不会为新插入的行回收。因此,如果希望原始ID和插入的ID连续流动,请检查该表

尝试导出向导。右键单击数据库>任务>导出数据表2是否有C1的标识列?此外,它们是否在同一台服务器上?是的,c1是一个标识列,它们位于同一台服务器上。如果要在表2中保留对表1中原始记录的引用,则可以在表2中添加一个额外字段。F.e.命名为“表1ID”。不过,这又违反了《基本法》的精神。不,我不需要参考表1。我只需要扫描列c1中的最后一个数字,并将+1增加到该列。这将不起作用。身份可以也将有差距。当服务器重新启动时,它们会跳跃10000左右。删除的任何行也会生成间隙。当然,除非他们不在乎他们是否能再把这些行绑在一起。如果是这样的话,这就行了。对不起,我弄错了。列c1不是标识,只是主键。违反主键约束“pk_cl”。无法在对象中插入重复键…如何执行合并语句?仅添加,不更新或删除。
IF (OBJECT_ID('tempdb..#myTable1') IS NOT NULL)
BEGIN
   DROP TABLE #myTable1
END;

IF (OBJECT_ID('tempdb..#myTable2') IS NOT NULL)
BEGIN
   DROP TABLE #myTable2
END;

CREATE TABLE #myTable1 ([C1] int identity(1,1), [C2]  varchar(10),  [C3]  varchar(10));

CREATE TABLE #myTable2 ([C1] int identity(1,1), [C2]  varchar(10),  [C3]  varchar(10));

Insert INTO #myTable1(C2, C3)
values
 ('Name 1', 'Address 1')
, ('Name 2', 'Address 2')
, ('Name 3', 'Address 3')
, ('Name 4', 'Address 4')

Insert INTO #myTable2(C2, C3)
values
  ('Name 11', 'Address 11')
, ('Name 12', 'Address 12')
, ('Name 13', 'Address 13')
, ('Name 14', 'Address 14')

select * from #myTable1
select * from #myTable2

INSERT INTO #myTable2 (C2, C3)
    select t1.c2, t1.c3
      FROM         [#myTable1] t1
      LEFT JOIN    [#myTable2] t2 ON t1.C2 = t2.C2 and t1.C3 = t2.C3
    where t2.c2 is null and t2.c3 is null
    order by t1.C1

select * from #myTable2