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 で、別のリンク サーバーで 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 台のサーバーを使用するアーキテクチャは避けられません。

4

1 に答える 1

0

よし、なんとなく解決できた。

sproc1 のように sproc2 でそれを実行しました。また、sproc2 で一時テーブルと openquery を使用します。次に、一時テーブルで Select を実行します。

これは、上記のバージョンで必要だった msdtc を起動しなくても機能します。唯一の要件は持っていることです

SET FMTONLY OFF;
SET NOCOUNT ON;

私のsproc2で。

于 2010-04-22T09:10:37.973 に答える