【问题标题】:How to get resultset with stored procedure calls over two linked servers?如何通过两个链接服务器上的存储过程调用获取结果集?
【发布时间】:2010-04-21 15:23:15
【问题描述】:

我在使用链接服务器上的过程调用的结果集填充临时表时遇到问题,其中再次调用了另一台服务器上的过程。

我有一个带有以下代码的存储过程 sproc1,它调用链接服务器上的另一个过程 sproc2。

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 的提示,但没有成功。 但也许,我可以更改 sproc1 中的代码。临时表和开放查询是否有替代方案?

只需从服务器 A 到 B 到 C 调用存储过程并返回结果集即可(我经常在应用程序中这样做)。但是这种临时表和 openquery 的特殊情况不起作用!

或者我想做什么是不可能的?微软的文章指出:

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

这是我的情况吗?

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

【问题讨论】:

    标签: sql-server sql-server-2005 tsql linked-server


    【解决方案1】:

    好的,我可以解决它。

    现在我刚刚在 sproc2 中完成了,就像在 sproc1 中一样:我还在 sproc2 中使用了一个临时表和 openquery。然后我在我的临时表上做一个选择。

    即使没有启动 msdtc 也能正常工作,这在上述版本中是必需的。 唯一的要求是拥有

    SET FMTONLY OFF;
    SET NOCOUNT ON;
    

    在我的 sproc2 中。

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多