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

时间:2010-04-21 15:23:16

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

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

我有一个带有以下代码的存储过程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:我无法避免使用三台服务器的架构。

1 个答案:

答案 0 :(得分:0)

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

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

即使没有启动msdtc,这仍然有效,这在上面的版本中是必需的。 只有要求是

SET FMTONLY OFF;
SET NOCOUNT ON;

在我的sproc2中。