2017-06-22 1 views
2

Ich habe diese gespeicherte Prozedur, die viele SQL Abfragen ausführt und die Ergebnisse zurückgibt. Wie gehe ich vor, nur die Ergebnisse von den Abfragen zurückzugeben, die Reihen zurückbringen?Gespeicherte Prozedur - Nur zurückgeben, wenn Zeilen> 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 

Bitte helfen Sie mir ...

+0

Gibt jede Abfrage die gleichen Felder in den Ergebnissen zurück? –

+1

Warum sollte die Anwendung Resultsets nicht korrekt verwerfen, wenn rowcount = 0? SQL Server weiß nicht im Voraus, dass einige dynamische SQL, die Sie werfen möchten, 0 oder> 0 Zeilen ergeben. Der einzige Weg, dies zu tun, wäre, alle Informationen in einer #temp-Tabelle zu sammeln und als Eins zurückzugeben (oder eine Schleife darüber zu wiederholen) oder jede Abfrage in der Schleife zweimal auszuführen (einmal, um zu prüfen, ob sie existiert) , dann * vielleicht * noch einmal, wenn die Anzahl> 0 ist. –

Antwort

1

Um zu vermeiden, leere Ergebnismengen zurückgehen müssen Sie bedingt jede Abfrage auszuführen. Zum Beispiel:

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 

Oder, wenn jedes Ergebnismenge identisch ist, können Sie eine temporäre Tabelle zunächst erstellen und dann alle Werte in die temporären Tabelle einzufügen, und dann am Ende aus dem temporären einer einzigen Select-Anweisung tun Tabelle:

create #temp (field1 type null, field2 type null, field3 type null) 

declare @query varchar(4000) 

declare cur cursor local for 
    select 'insert into #temp ' + 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 * from #temp 
drop table #temp 

Wenn möglich, ist die zweite Option besser, weil es nur jede Abfrage einmal ausführen wird. Die erste Option führt jede Abfrage zweimal aus (die Daten werden zurückgegeben), einmal um zu testen, ob es Ergebnisse gibt, und einmal, um die Daten zurückzugeben. Das ist nicht effizient! Hoffentlich geben alle Abfragen die gleichen Felder in den Ergebnissen zurück und Sie können die zweite Option verwenden.

1

Sie können die Ergebnisse auch mit der Strategie If exists ausführen und auswerten.

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

Ich glaube nicht, dass Sie 'exec()' innerhalb von 'if exists()' verwenden können. –

Verwandte Themen