代码之家  ›  专栏  ›  技术社区  ›  räph

如何通过两个链接的服务器上的存储过程调用获取resultset?

  •  1
  • räph  · 技术社区  · 16 年前

    我在用链接服务器上的过程调用的结果集填充临时表时遇到问题,在这个临时表中,又调用了另一个服务器上的过程。

    SET @sqlCommand = 'INSERT INTO #tblTemp ( ModuleID, ParamID) ' +
    '( SELECT * FROM OPENQUERY(' + @targetServer + ', ' +
    '''SET FMTONLY OFF; EXEC ' + @targetDB + '.usr.sproc2 ' + @param + ''' ) )'
    
    exec ( @sqlCommand )
    

    现在在调用的sproc2中,我再次调用另一个链接服务器上的第三个过程sproc3,它返回我的结果集。

    SET @sqlCommand = 'EXEC ' + @targetServer +'.database.usr.sproc3 ' + @param
    exec ( @sqlCommand )
    

    整个过程都不起作用,因为我得到了一个SQL错误7391

    无法执行该操作,因为链接服务器“%ls”的OLE DB访问接口“%ls”无法开始分布式事务。

    我已经查过了 microsoft article ,但没有成功。 但也许,我可以更改存储过程1中的代码。除了temp表和open查询之外,还有其他方法吗?

    或者我不可能做我想做的事?microsft的文章指出:

    检查目标服务器上引用的对象。如果它是一个视图或存储过程,或者导致触发器的执行,请检查它是否隐式引用另一个服务器。如果是这样,第三台服务器就是问题的根源。直接在第三台服务器上运行查询。如果不能直接在第三台服务器上运行查询,那么问题实际上不是链接服务器查询的问题。先解决根本问题。

    这是我的案子吗?

    PS:我无法避免三台服务器的架构。

    1 回复  |  直到 16 年前
        1
  •  0
  •   räph    16 年前

    好吧,我可以想办法解决。

    即使在没有启动msdtc的情况下也可以工作,这在上面的版本中是必需的。

    SET FMTONLY OFF;
    SET NOCOUNT ON;
    

    推荐文章