sql >> データベース >  >> RDS >> Sqlserver

OPENQUERY (exec ストアド プロシージャ) を使用して新しい一時テーブルを作成すると、エラー 11526 で失敗する

    これを試してください:

    SELECT *
    FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;
    

    これは、リンク サーバーを介してストアド プロシージャを実行すると、プロバイダは最初に結果の行セットの形状を決定しようとするためです。 SET FMTONLY ON; を発行することでこれを行います。 次に、ステートメントを実行します。一時テーブルを使用しないストアド プロシージャでは、これはうまく機能します。クエリ パーサーは、基本的に、すべてのデータを実際に取得することなく、メタデータだけを取得することなく予行演習を行います (推定実行計画を表示するようなものです)。

    問題は、ストアド プロシージャが そう 一時テーブルを使用すると失敗します。一時テーブルのメタデータが存在しないためです。一時テーブルを使用しないストアド プロシージャに対して機能するメタ分析を通じて収集することはできません。解決策は、手動で SET FMTONLY OFF; することです。 ストアド プロシージャを実行しているバッチ内。

    この方法を使用すると、ストアド プロシージャが2 回実行されることに注意してください。 . 1 回目はメタデータ (破棄されるデータ) を収集し、2 回目は実際にデータを返します。呼び出されたストアド プロシージャが特にコストがかかるか、副作用がある場合は、余裕を持たせる必要があるかもしれません。

    最後に、このトリックはすべてのストアド プロシージャで機能するわけではないことに注意してください。ストアド プロシージャが実行できることは、作業にレンチを投入するだけです。すべての可能性を知っているわけではありませんが、そのうちの 1 つは複数のレコードセットを返しています。

    SET FMTONLY OFF という更新に応じて 機能しません:一時テーブルを使用しないように、またはセッションキーの永続テーブルを使用するように SP を再構築できますか?これらのオプションのいずれかが機能します。 SQL Server 2012 では、table-値のパラメータ .

    Erland Sommarskog の ストアド プロシージャ間でデータを共有する方法 をお読みください。 目的を達成するためのインスピレーションを与えてくれるかもしれません。



    1. 日付範囲の比較

    2. DataGrip でサーバー出力をオンに設定する方法

    3. フォーラムの権限を実装するにはどうすればよいですか

    4. GROUP BY、ORDER BY、およびHAVINGを組み合わせる方法