ストアドプロシージャ内で、カーソル内で別のストアドプロシージャが呼び出されています。呼び出しごとに、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
ありがとう!
結果を一時テーブルに挿入してから、一時テーブルをドロップできます
create table #tmp (columns)
while
...
insert into #tmp exec @RC=dbo.NoisyProc
...
end
drop table #tmp
それ以外の場合、呼び出されているプロシージャを変更して、結果セットを出力しないように指示するフラグを受け入れることができますか?
以下の手順に従って、SQL Server Mgmt Studio 2005の結果セットを破棄できます。
•クエリウィンドウを右クリック
•「クエリオプション」を選択します
•左側のパネルのツリービューで[結果] [ノード]をクリックします
•フォームの中央/右側にある「実行後に結果を破棄する」にチェックを入れます
試着できます
DECLARE @i int
SET @i = 1
WHILE (@i <= 100)
BEGIN
SELECT @i as Iteration
SET @i = @i + 1
END
この質問は古いのですが、SET NOCOUNT ON
SPがすべての行にメッセージを出力するのを防ぎます。
悪いカーソル。カーソルでセットベースの関数を実行する必要がある場合は、ストアドプロシージャコードを再利用しないでください。 set-nベースの方法でコードを記述する方がパフォーマンスが向上します。
カーソルにエラーがあるよりも、メッセージを抑制することに関心があると思います。
おそらく、エラーは、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(またはメニューの[クエリ]-> [結果]-> [結果をテキスト])を押して、出力をテーブルのようなレコードセットではなくプレーンテキストにすることです。最終的には別の制限に達します(結果ウィンドウは無限量のテキスト出力を処理できません)が、はるかに大きくなります。
上記のサンプルでは、結果をテキスト形式に変更した後にエラーが発生しません!
場所:
SET ROWCOUNT OFF
/* the internal SP */
SET ROWCOUNT ON
これを内部SPで囲むか、元のクエリからのSELECTステートメントで囲むと、結果が表示されなくなります。