如何在标识列中复制数据?

时间:2015-08-14 05:28:32

标签: sql sql-server sql-server-2008-r2

我在服务器中有一个带有identity列的表,并且在另一个服务器中有另一个具有相同结构的表。现在我想将所有数据从一个表复制到另一个表但是我无法帮助它...

我已经创建了一个链接服务器..

我用这个:

insert into [server].[database].[dbo].[table1]
    select *
    from table2

我也在*

的位置使用没有标识列的查询
insert into [server].[database].[dbo].[table1]
   select column1, column2
   from table2

我该怎么办?

3 个答案:

答案 0 :(得分:7)

如果要插入另一个也有标识列的表,则需要明确定义要插入的列的列表,并省略identity列:

insert into [server].[database].[dbo].[table1] (col1, col2)
   select column1, column2
   from table2

这样,SQL Server可以在目标表中插入标识值

<强>更新

两种情况:

(1)您希望将旧表中的标识列中的现有值插入新表中 - 在这种情况下,您需要在查询中使用SET IDENTITY_INSERT ON/OFF

SET IDENTITY_INSERT [192.168.1.6].[audit].[dbo].[tmpDTTransfer] ON 

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] (id, code, transfer1)
   SELECT  
       id, code, transfer1 
   FROM 
       tmpDTTransfer 

SET IDENTITY_INSERT [192.168.1.6].[audit].[dbo].[tmpDTTransfer] OFF

(2)如果您不想插入现有的标识值,只想插入其他列并让SQL Server在目标表中分配新的标识值,那么您 don您的查询中需要使用 SET IDENTITY_INSERT ON/OFF

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] (code, transfer1)
   SELECT  
       code, transfer1 
   FROM 
       tmpDTTransfer 

但是在任何你,你应该始终明确定义要插入到目标表中的列的列表。

请勿使用:

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] 
   .......

但改为使用

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] (Code, Transfer1)
   .......

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] (Id, Code, Transfer1)
   .......

或任何你需要的东西。关于你要插入的内容明确

答案 1 :(得分:2)

为表格设置IDENTITY_INSERT

  SET IDENTITY_INSERT [server].[database].[dbo].[table1] ON
  insert into [server].[database].[dbo].[table1]
  select column1,column2
  from table2
  SET IDENTITY_INSERT [server].[database].[dbo].[table1] OFF

答案 2 :(得分:1)

如果您不一定需要使用SQL脚本,那么您可以使用SQL Server导入和导出向导来执行此操作。 您可以阅读教程here on MSDN