我用的是sql server 如何在存储过程里调用其他服务器的存储过程,那位大哥帮帮忙,谢谢!

解决方案 »

  1.   

    我在存储过程里写了
    exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','173.25.62.1'
    exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','50969336'
    exec sp_serveroption 'srv_lnk','rpc out','true'  --这个允许调用链接服务器上的存储过程
    但它提示
    服务器: 消息 15002,级别 16,状态 1,过程 sp_addlinkedserver,行 19
    不能在事务内部执行过程 'sp_addlinkedserver'。
    服务器: 消息 15002,级别 16,状态 1,过程 sp_addlinkedsrvlogin,行 17
    不能在事务内部执行过程 'sp_addlinkedsrvlogin'。
    服务器: 消息 15002,级别 16,状态 1,过程 sp_serveroption,行 18
    不能在事务内部执行过程 'sp_serveroption'。如果我直接在查询分析器里查询是正常的,在存储过程里我该如何该呢?
      

  2.   

    这位兄弟,可能你理解错了,这个只要执行一次就行了吖!!!即直接在查询分析器里建一次就行了!前提是你没有执行sp_dropserver来删除这个注册.你在存储过程直接就可以用 exec srv_lnk.yourdatabase.dbo.yourproc
      

  3.   

    还是不行呀,请大家帮帮忙看看我的存储过程,我的主要目的是想调用其他服务器的存储过程然后把里面的数据插入到我的临时表里!CREATE PROCEDURE yzl_ybasCreate TABLE #yb(
               yb_fd char(30),
               yb_pluid char(30),
               yb_bm char(30),
               yb_name char(30),
               yb_gg char(10),
               yb_dw  char(10),
               yb_xs int,
               yb_kc int
    )exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','173.25.62.1'
    exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','50969336'
    exec sp_serveroption 'srv_lnk','rpc out','true'  --这个允许调用链接服务器上的存储过程insert into #yb ( yb_fd,yb_pluid,yb_bm,yb_name,yb_gg,yb_dw) exec srv_lnk.V7GMS.dbo.GetMooncakeStatus '14002921'--exec srv_lnk.V7GMS.dbo.GetMooncakeStatus '14002921' 
    exec   sp_droplinkedsrvlogin   'srv_lnk',null   
    exec   sp_dropserver   'srv_lnk'   
    select * from  #ybdrop table #yb
    --COMMIT TRANSACTION
    GO
    但执行完后就会提示
    该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
    [OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
    OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。如果只是单纯的调用exec srv_lnk.V7GMS.dbo.GetMooncakeStatus '14002921' 就没问题
    但如果 insert into #yb ( yb_fd,yb_pluid,yb_bm,yb_name,yb_gg,yb_dw) exec srv_lnk.V7GMS.dbo.GetMooncakeStatus '14002921' 就会提示该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
    [OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
    OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
    这是为何呀,请各位大哥帮帮忙小弟谢谢了!
      

  4.   

    to Happ_QJW928
    如何配置呢?其实我插入到临时表里主要就是想对表的数据做筛选,但是直接exec 存储过程就没问题,但是插入零时表就会出错,能不能直接对存储过程进行筛选呢例如exec 存储过程 where  hh='123'之类的,在线等待急...
      

  5.   

    这一段在查询分析器执行一次(非存储过程)
    exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','173.25.62.1' 
    exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','50969336' 
    exec sp_serveroption 'srv_lnk','rpc out','true'这个不执行
    exec  sp_droplinkedsrvlogin  'srv_lnk',null  
    exec  sp_dropserver  'srv_lnk' 存储过程变成CREATE PROCEDURE yzl_yb as Create TABLE #yb( 
              yb_fd char(30), 
              yb_pluid char(30), 
              yb_bm char(30), 
              yb_name char(30), 
              yb_gg char(10), 
              yb_dw  char(10), 
              yb_xs int, 
              yb_kc int 
    ) insert into #yb ( yb_fd,yb_pluid,yb_bm,yb_name,yb_gg,yb_dw) exec srv_lnk.V7GMS.dbo.GetMooncakeStatus '14002921' --exec srv_lnk.V7GMS.dbo.GetMooncakeStatus '14002921' select * from  #yb 
    drop table #yb 
    --COMMIT TRANSACTION 
    GO 
    你是这样做了吗?
      

  6.   

    过程中打开这个,完了再关掉
    SET xact_abort ON 
    MSDTC 服务启动了没有?? 管理器里面RPC服务有没有启动?
      

  7.   

    to dinoalex
    是这样做的但他出现下面的错误,还有没有其他的方法来抓取存储过程里的数据呢?麻烦告知,谢谢!服务器: 消息 7391,级别 16,状态 1,行 19
    该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB.1' 无法启动分布式事务。
    [OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]