24

ストアド プロシージャ内で、別のストアド プロシージャがカーソル内で呼び出されています。呼び出しごとに、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

ありがとう!

4

7 に答える 7

33

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

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

あなたはそれを試着することができます

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

于 2008-10-17T17:14:21.950 に答える
16

結果を一時テーブルに挿入してから、一時テーブルを削除できます

create table #tmp (columns)

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

それ以外の場合、結果セットを出力しないように指示するフラグを受け入れるように呼び出される proc を変更できますか?

于 2008-10-17T16:19:37.067 に答える
12

この質問が古いことは知っていますがSET NOCOUNT ON、SPがすべての行にメッセージを出力しないように設定できます。

于 2011-02-14T15:51:33.463 に答える
3

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

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

于 2008-10-17T17:29:05.693 に答える
1

おそらく、エラーは、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(またはメニューの[クエリ]->[結果]->[結果からテキスト])を押して、出力をテーブルのようなレコードセットではなくプレーンテキストにすることです。最終的には別の制限に達しますが(結果ウィンドウは無限の量のテキスト出力を処理できません)、それでもはるかに大きくなります。

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

于 2008-10-17T18:37:36.010 に答える
0

場所:

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

それを内部SPの周りにラップするか、元のクエリからのSELECTステートメントの周りにそれを行うこともできます。これにより、結果が表示されなくなります。

于 2008-10-17T15:33:59.903 に答える