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)
我该怎么办 ?
如果要插入另一个也具有标识列的表,则需要显式定义要插入的列的列表并省略该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)
或者你需要什么.要明确你要插入到什么!