我在使用链接服务器上的过程调用的结果集填充临时表时遇到问题,其中再次调用了另一台服务器上的过程。
我有一个带有以下代码的存储过程 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:我无法避免使用三台服务器的架构。