这两句实在远程的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 不可用。换了几个表 有的好使 有的不好使
表的结构都一样啊。 对于远程操作的表难道有什么特殊要求???????
 
有高手知道原因么?

解决方案 »

  1.   

    在对ltab2操作的时候在该表上还有其他操作?
      

  2.   

    没有别的操作 用两个没人使用的电脑测试
    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无论什么操作失败都抱这个错??
      

  3.   

    --PK
    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 
    ---------------------------------------------------------------------------------------
      

  4.   

    从本地'192.168.3.2'读取数据后插入到远程表中 你的语句是在地'192.168.3.2'这台计算机上执行的? 语句写反了吧,insert的是你本地表,而不是远程表啊。
      

  5.   

    其中有个电脑的MSDTC没有打开,你打开试试。
      

  6.   


    如果MSDTC没打开 为什么同样的语句 第一个可以成功呢?
    应该都打开了
      

  7.   

    -------ChinaJiaBing------------------
    试了ChinaJiaBing的语句 二个都成功!!!
    insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 
    select *from 本地表 看看了和我区别是我的语句是在远程sql上运行 ChinaJiaBing的是在本地数据库运行
    从连接看 我的是远程机器主动连我  ChinaJiaBing的是本地主动去连接远程
    我的 是在本地上执行  ChinaJiaBing的是在远程上执行!
    难道和这些不同有关??ChinaJiaBing能解释解释么????为什么执行顺序到过来就可以了??
    还有 在那边执行的效率和速度要快!??
      

  8.   

    LZ 是說,單獨跑
      select * from  OPENROWSET 
                            ('SQLOLEDB','192.168.3.2';'sa';'***', 'SELECT * FROM  test.dbo.ltab2 ') 
    可以,
    但是加上insert 就不行嗎?
      

  9.   

    弱弱问下,tab2是在本地server吗?
      

  10.   


    insert into 这里的都是在远程 这二句是发送到远程的sql 服务上执行
    所以tab2 指的是远程sql上的表
      

  11.   


    那当然会报错了
    如果要insert 远程table,请先建立dblink,开启MSDTC
    然后用 类似 insert into  dblinkname.dbname.dbo.tab2 (xxx) select xxx
      

  12.   


    为什么第一句话就不保做 并且成功
    换到别的表 比如:tab3,tab4 有的好使 有的报 未开启MSDTC错误
      

  13.   

    MSDTC 两边都开启  这句话运行在本地sql上  '192.168.3.2'是远程服务器
    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]。

      

  14.   

    MSDTC 两边都开启  insert into  tab2 
      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]。