我在链接服务器上的过程调用中使用结果集填充临时表时遇到问题,其中再次调用另一个服务器上的过程。
我有一个带有以下代码的存储过程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:我无法避免使用三台服务器的架构。
答案 0 :(得分:0)
好的,我可以用某种方式解决它。
现在我刚刚在sproc2中做了它,就像在sproc1中一样:我也在sproc2中使用临时表和openquery。然后我在临时表上做一个选择。
即使没有启动msdtc,这仍然有效,这在上面的版本中是必需的。 只有要求是
SET FMTONLY OFF;
SET NOCOUNT ON;
在我的sproc2中。