SQL数据库,如何把服务器中的一张表插入到另外一个服务器的一张表中?SQL语句该如何写?如下:

服务器1(user:sa1,password:123)、数据库1、表1 和 服务器2(user:sa2,password:456)、数据库2、表2,现需要将表1插入到表2中,使用SQL语句如何实现?

参考资料:select * into 表 from
('SQLOLEDB','sql服务器名';'用户名';'密码',数据库名.dbo.表名)

以及openrowset()和openquery()到底有什么区别?

第1个回答  推荐于2017-11-25
在服务器2 数据库2的查询分析器里执行
insert into 新表名
select *
from OPENDATASOURCE('SQLOLEDB','Data Source=服务器1;User ID=sa1;Password=123) .数据库1.dbo.表1追问

那我还想请问您:openrowset()和openquery()以及和你刚刚写的OPENDATASOURCE(),三者到底怎么去理解?

追答

OPENDATASOURCE
不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分对象名的一部分。
OPENQUERY
在给定的链接服务器(一个 OLE DB 数据源)上执行指定的直接传递查询。可以在查询的 FROM 子句中像引用表名那样引用 OPENQUERY 函数。依据 OLE DB 提供程序的能力,还可以将 OPENQUERY 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集,但是 OPENQUERY 只返回第一个。

OPENROWSET
包含访问 OLE DB 数据源中的远程数据所需的全部连接信息。当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的、特殊的方法。可以在查询的 FROM 子句中像引用表名那样引用 OPENROWSET 函数。依据 OLE DB 提供程序的能力,还可以将 OPENROWSET 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集,然而 OPENROWSET 只返回第一个。

追问

牛!谢谢您

追答

简单点理解:
opendatasource,openrowset 这两种查询方式 不需要链接服务器 它们是一次性的查询 用于偶尔的分布式查询

OPENQUERY 对给定的链接服务器执行指定的传递查询。该服务器是 OLE DB 数据源。OPENQUERY 可以在查询的 FROM 子句中引用,就好象它是一个表名。OPENQUERY 也可以作为 INSERT、UPDATE 或 DELETE 语句的目标表进行引用。

追问

也就是说:opendatasource,openrowset 不属于定向的。OPENQUERY 属于定向连接的

追答

opendatasource,openrowset 相当於一次性筷子,方便快捷,但次数一次,OPENQUERY 相当於正常筷子,你用完还可以用,大概这个意思

本回答被提问者采纳
第2个回答  2012-06-07
select * into #A from OPENDATASOURCE('SQLOLEDB','Data Source=服务器1;User ID=sa1;Password=123) .数据库1.dbo.表1
insert into 表2
select * from #a追问

那我还想请问您:openrowset()和openquery()以及和你刚刚写的OPENDATASOURCE(),三者到底怎么去理解?

追答

我只是用过OPENDATASOURCE
这也是我在网上看到的 你可以看看下面的案例,也许对你有帮助

--查询示例
select * from ITSV.数据库名.dbo.表名

--导入示例
select * into 表 from ITSV.数据库名.dbo.表名

--以后不再使用时删除链接服务器
exec sp_dropserver 'ITSV ', 'droplogins '

--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset

--查询示例
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--生成本地表
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--把本地表导入远程表
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表

--更新本地表
update b
set b.列A=a.列A
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1

--openquery用法需要创建一个连接

--首先创建一个连接创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
--查询
select *
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
--把本地表导入远程表
insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ')
select * from 本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a
inner join 本地表 b on a.列A=b.列A

--3、opendatasource/openrowset
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名
select * from 本地表

追问

谢谢您,不过#A和#a,在你的语句中是什么意思?

追答

其实是一个表
我的资料库是sqlserver2000 的跨伺服器存资料要放到一张临时表裏面
你可以直接
insert into 表2
select * from OPENDATASOURCE('SQLOLEDB','Data Source=服务器1;User ID=sa1;Password=123) .数据库1.dbo.表1

追问

非常感谢

相似回答