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.
Gibt jede Abfrage die gleichen Felder in den Ergebnissen zurück? –
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. –