1

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

我有一个带有以下代码的存储过程 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”无法开始分布式事务。

我已经检查了这篇微软文章的提示,但没有成功。但也许,我可以更改 sproc1 中的代码。临时表和开放查询是否有替代方案?

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

还是我想做的事情不可能?微软的文章指出:

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

这是我的情况吗?

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

4

1 回答 1

0

好的,我可以以某种方式解决它。

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

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

SET FMTONLY OFF;
SET NOCOUNT ON;

在我的 sproc2.

于 2010-04-22T09:10:37.973 回答