web-dev-qa-db-ja.com

ストアドプロシージャからストアドプロシージャを実行するときにクエリ結果を無効にするにはどうすればよいですか?

ストアドプロシージャ内で、カーソル内で別のストアドプロシージャが呼び出されています。呼び出しごとに、SQL Management Studioの結果ウィンドウに結果が表示されます。カーソルは100回以上ループし、その時点で結果ウィンドウはエラーになります。カーソル内のストアドプロシージャが結果を出力しないようにする方法はありますか?

  WHILE @@FETCH_STATUS = 0
  BEGIN
    EXEC @RC = dbo.NoisyProc
    SELECT @RValue2 = 1 WHERE @@ROWCOUNT = 0
    FETCH NEXT FROM RCursor INTO @RValue1, @RValue2
  END

ありがとう!

22
Alex Angas

結果を一時テーブルに挿入してから、一時テーブルをドロップできます

create table #tmp (columns)

while
    ...
    insert into #tmp exec @RC=dbo.NoisyProc
    ...
end
drop table #tmp

それ以外の場合、呼び出されているプロシージャを変更して、結果セットを出力しないように指示するフラグを受け入れることができますか?

14
Steven A. Lowe

以下の手順に従って、SQL Server Mgmt Studio 2005の結果セットを破棄できます。

•クエリウィンドウを右クリック
•「クエリオプション」を選択します
•左側のパネルのツリービューで[結果] [ノード]をクリックします
•フォームの中央/右側にある「実行後に結果を破棄する」にチェックを入れます

試着できます

DECLARE @i int
SET @i = 1
WHILE (@i <= 100)
  BEGIN
    SELECT @i as Iteration
    SET @i = @i + 1
  END
31
6eorge Jetson

この質問は古いのですが、SET NOCOUNT ON SPがすべての行にメッセージを出力するのを防ぎます。

10
Estanislao

悪いカーソル。カーソルでセットベースの関数を実行する必要がある場合は、ストアドプロシージャコードを再利用しないでください。 set-nベースの方法でコードを記述する方がパフォーマンスが向上します。

カーソルにエラーがあるよりも、メッセージを抑制することに関心があると思います。

3
HLGEM

おそらく、エラーは、SPまたはカーソル自体のロジックの欠陥ではなく、返されるレコードセットが多すぎることに起因します。この例を見てください。

DECLARE @I INT
SET @I=0
WHILE @I<200 BEGIN
    SELECT * FROM INFORMATION_SCHEMA.TABLES
    SET @I = @I + 1
END

何回か(100を少し超える)実行され、失敗します。

クエリが、結果グリッドに表示できる結果セットの最大数を超えました。グリッドには最初の100個の結果セットのみが表示されます。

SSMSは、表示できるレコードセットの数に制限があります。この制限を回避する簡単な方法の1つは、Ctrl + T(またはメニューの[クエリ]-> [結果]-> [結果をテキスト])を押して、出力をテーブルのようなレコードセットではなくプレーンテキストにすることです。最終的には別の制限に達します(結果ウィンドウは無限量のテキスト出力を処理できません)が、はるかに大きくなります。

上記のサンプルでは、​​結果をテキスト形式に変更した後にエラーが発生しません!

1
Joe Pineda

場所:

SET ROWCOUNT OFF
/* the internal SP */
SET ROWCOUNT ON

これを内部SPで囲むか、元のクエリからのSELECTステートメントで囲むと、結果が表示されなくなります。

0
Adam