这两句实在远程的sql端执行 从本地'192.168.3.2'读取数据后插入到远程表中
insert into tab1
select * from OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab1 ')
------------------------这个就成功
insert into tab2
select * from OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab2 ')
-------------------这个就报错!服务器 '' 上的 MSDTC 不可用。换了几个表 有的好使 有的不好使
表的结构都一样啊。 对于远程操作的表难道有什么特殊要求???????
有高手知道原因么?
insert into tab1
select * from OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab1 ')
------------------------这个就成功
insert into tab2
select * from OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab2 ')
-------------------这个就报错!服务器 '' 上的 MSDTC 不可用。换了几个表 有的好使 有的不好使
表的结构都一样啊。 对于远程操作的表难道有什么特殊要求???????
有高手知道原因么?
insert into tab2
-------------下面单独执行就好使! 加上插入就报服务器 '' 上的 MSDTC 不可用
select * from OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab2 ') ---------------------
还有就是 上面好使tab1操作 如果 OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab1 ') 查出来没有行
也报 !服务器 '' 上的 MSDTC 不可错误!
难道 sql无论什么操作失败都抱这个错??
select * from sys.key_constraints where object_id = OBJECT_ID('TB')
--FK
select * from sys.foreign_keys where parent_object_id =OBJECT_ID('TB')
--创建链接服务器
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例
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
---------------------------------------------------------------------------------------
如果MSDTC没打开 为什么同样的语句 第一个可以成功呢?
应该都打开了
试了ChinaJiaBing的语句 二个都成功!!!
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
select *from 本地表 看看了和我区别是我的语句是在远程sql上运行 ChinaJiaBing的是在本地数据库运行
从连接看 我的是远程机器主动连我 ChinaJiaBing的是本地主动去连接远程
我的 是在本地上执行 ChinaJiaBing的是在远程上执行!
难道和这些不同有关??ChinaJiaBing能解释解释么????为什么执行顺序到过来就可以了??
还有 在那边执行的效率和速度要快!??
select * from OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab2 ')
可以,
但是加上insert 就不行嗎?
insert into 这里的都是在远程 这二句是发送到远程的sql 服务上执行
所以tab2 指的是远程sql上的表
那当然会报错了
如果要insert 远程table,请先建立dblink,开启MSDTC
然后用 类似 insert into dblinkname.dbname.dbo.tab2 (xxx) select xxx
为什么第一句话就不保做 并且成功
换到别的表 比如:tab3,tab4 有的好使 有的报 未开启MSDTC错误
insert into tab2
select * from OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab2 ') 把远程sql 的数据保存到本地。错误:该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
select * from OPENROWSET
('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM test.dbo.ltab2 ')
执行报错:该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。