別のサーバー上のプロシージャが再度呼び出されるリンク サーバー上のプロシージャ コールからの結果セットを一時テーブルに格納する際に問題があります。
次のコードを持つストアド プロシージャ sproc1 があり、リンク サーバーで別のプロシージャ sproc2 を呼び出します。
SET @sqlCommand = 'INSERT INTO #tblTemp ( ModuleID, ParamID) ' +
'( SELECT * FROM OPENQUERY(' + @targetServer + ', ' +
'''SET FMTONLY OFF; EXEC ' + @targetDB + '.usr.sproc2 ' + @param + ''' ) )'
exec ( @sqlCommand )
呼び出された sproc2 で、別のリンク サーバーで 3 番目のプロシージャ sproc3 を再度呼び出し、結果セットを返します。
SET @sqlCommand = 'EXEC ' + @targetServer +'.database.usr.sproc3 ' + @param
exec ( @sqlCommand )
SQL エラー 7391 が発生するため、すべてが機能しません。
リンク サーバー "%ls" の OLE DB プロバイダ "%ls" が分散トランザクションを開始できなかったため、操作を実行できませんでした。
このMicrosoft articleでヒントを既に確認しましたが、成功しませんでした。でも、sproc1 のコードを変更できるかもしれません。一時テーブルと開いているクエリに代わるものはありますか?
サーバー A からサーバー B、サーバー C にストアド プロシージャを呼び出し、結果セットを返すだけで機能します (私はこれをアプリケーションで頻繁に行います)。しかし、一時テーブルと openquery を使用したこの特殊なケースは機能しません!
それとも、私がやろうとしていることは不可能ですか?マイクロソフトの記事には次のように記載されています。
宛先サーバーで参照するオブジェクトを確認してください。ビューまたはストアド プロシージャである場合、またはトリガーの実行を引き起こす場合は、別のサーバーを暗黙的に参照しているかどうかを確認してください。その場合、3 番目のサーバーが問題の原因です。3 番目のサーバーでクエリを直接実行します。3 番目のサーバーでクエリを直接実行できない場合、問題は実際にはリンク サーバー クエリにはありません。根本的な問題を最初に解決します。
これは私の場合ですか?
PS: 3 台のサーバーを使用するアーキテクチャは避けられません。