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

dav*_*sam 4 sql sql-server sql-server-2008-r2

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

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

我用这个:

insert into [server].[database].[dbo].[table1]
    select *
    from table2
Run Code Online (Sandbox Code Playgroud)

我也使用此查询而没有标识列代替 *

insert into [server].[database].[dbo].[table1]
   select column1, column2
   from table2
Run Code Online (Sandbox Code Playgroud)

我该怎么办 ?

mar*_*c_s 9

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

insert into [server].[database].[dbo].[table1] (col1, col2)
   select column1, column2
   from table2
Run Code Online (Sandbox Code Playgroud)

这样,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
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] (code, transfer1)
   SELECT  
       code, transfer1 
   FROM 
       tmpDTTransfer 
Run Code Online (Sandbox Code Playgroud)

但是在任何你,你应该总是在目标表中明确定义要插入的列的列表.

不使用:

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] 
   .......
Run Code Online (Sandbox Code Playgroud)

而是使用

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] (Code, Transfer1)
   .......
Run Code Online (Sandbox Code Playgroud)

要么

INSERT INTO [192.168.1.6].[audit].[dbo].[tmpDTTransfer] (Id, Code, Transfer1)
   .......
Run Code Online (Sandbox Code Playgroud)

或者你需要什么.要明确你要插入到什么!