2017-06-22 4 views
2

SQLのクエリを多く実行し、結果を返すこのストアドプロシージャがあります。行を返すクエリの結果のみを返すにはどうすればよいですか?ストアドプロシージャ - 行が0より大きい場合にのみ返される

BEGIN 
    DECLARE @Query varchar(4000) 
    DECLARE cur CURSOR FOR SELECT SQLSyntax FROM tblChecks 

    OPEN cur 
    FETCH NEXT FROM cur INTO @Query 
    WHILE @@FETCH_STATUS = 0 BEGIN 
    EXEC (@Query) 
    FETCH NEXT FROM cur INTO @Query 
    END 
    CLOSE cur 
    DEALLOCATE cur 
END 

あなたは条件付きで各クエリを実行する必要があり、空の結果セットを返す避けるために...

+0

各クエリは、その結果の同じフィールドを返しますか? –

+1

なぜアプリケーションは正しくrowcount = 0の結果セットを破棄しないのですか? SQL Serverは、あなたが投げようとしているいくつかの動的SQLが0または> 0の行を生成することを前もって知っていません。それを行う唯一の方法は、実際に#tempテーブル内のすべての情報を収集し、それを1つとして返すか(または再びループする)、ループ内の各クエリを2回実行することです、カウントが> 0の場合は*もう一度*となります)。 –

答えて

1

を助けてください。例えば:

declare @query varchar(4000) 

declare cur cursor local for 
    select 'if exists (' + SQLSyntax + ') ' + SQLSyntax from tblChecks 

open cur 
fetch next from cur into @query 

while @@fetch_status = 0 
begin 
    exec(@query) 
    fetch next from cur into @query 
end 

close cur 
deallocate cur 

あるいは、すべての結果セットが同じであれば、あなたは最初の一時テーブルを作成し、一時テーブルにすべての値を挿入し、一時から最後に単一のSELECT文を行うことができますテーブル:

可能であれば、各クエリが1回だけ実行されるため、可能であれば、2番目のオプションが優れています。 1番目のオプションは、各クエリを2回(データを返す)実行し、1回は結果があるかどうかをテストし、1回はデータを返すようにします。これは効率的ではありません!うまくいけば、すべてのクエリは結果の同じフィールドを返し、2番目のオプションを使用できます。

1

If exists戦略を使用して結果を実行して評価することもできます。

IF EXISTS(exec(@query)) 
    BEGIN 
     exec(@query) 
    END 
+0

'if exists()'の中で 'exec()'を使うことはできません。 –

関連する問題