Frage Wie führe ich eine SQL-Abfrage aus, ohne Ergebnisse anzuzeigen?


Ist es möglich, SQL Query auszuführen, ohne Ergebnisse anzuzeigen?

mögen

Select * from Table_Name

Nach dem Ausführen dieser Abfrage sollte das Ergebnis nicht in SQL Server angezeigt werden.


28
2018-06-17 13:38


Ursprung


Antworten:


Ausführen werden ein Re-Cord-Set zurückgeben. Es kann natürlich keine Reihen haben, aber ein Ergebnis erhalten

Sie können Zeilen, aber nicht die Ergebnismenge mit unterdrücken SET FMTONLY

SET FMTONLY ON
SELECT * FROM sys.tables

SET FMTONLY OFF
SELECT * FROM sys.tables

Hatte aber nie persönlich dafür Verwendung ...


29
2018-06-17 13:44



Ich bin überrascht, dass niemand auf die Antwort kam: Aktivieren Sie die Option "Abfrageergebnisse nach Ausführung verwerfen"; Ich bin mir ziemlich sicher, dass der Interviewer danach gesucht hat. SET FMT ONLY ist eine total andere Sache, IMHO.

In SSMS

  • öffne eine neue Abfrage
  • im Menü Wählen Sie Abfrage- / Abfrageoptionen
  • Wählen Sie den Ergebnisbereich
  • Überprüfen Sie das "Ergebnis nach der Ausführung verwerfen"

Der Grund, warum Sie dies tun sollten, besteht darin, zu vermeiden, dass Sie warten müssen und Ressourcen verschwenden müssen, damit die Ergebnisse in das Gitter geladen werden, aber immer noch z. der tatsächliche Ausführungsplan.


44
2018-03-21 19:30



Klingt nach einer dubiosen Interviewfrage für mich. Ich habe es getan, ich musste es tun, aber Sie müssen es nur unter ziemlich obskuren Umständen tun. Unklar, aber manchmal sehr wichtig.

Wie @gbn sagt, ist ein programmatischer Weg mit SET FMTONLY (Danke, jetzt muss ich es nicht mehr aus meinen alten Skriptdateien rausholen). Einige Programme und Dienstprogramme tun dies, wenn sie SQL abfragen; Zuerst senden sie eine Abfrage mit FMTONLY ON, um das Layout der resultierenden Tabellenstruktur zu bestimmen, und dann, wenn sie vorbereitet haben, dass sie mit FMTONLY OFF laufen, um die tatsächlichen Daten zu erhalten. (Ich fand das heraus, als die Prozedur eine zweite Prozedur anrief, die zweite Prozedur gab den Datensatz zurück, und aus obskuren Gründen fiel das ganze Kartenhaus zusammen.)

Dies kann auch in SSMS erfolgen. Aktivieren Sie für alle Abfragefenster unter Extras / Optionen, Abfrageergebnisse / SQL Server / Ergebnisse bis XX, "Ergebnisse nach Ausführung der Abfrage verwerfen"; nur für das aktuelle Fenster unter Abfrage / Abfrageoptionen, Ergebnisse / XX, gleiches Kontrollkästchen. Der Vorteil hierbei ist, dass die Abfrage auf dem Datenbankserver ausgeführt wird, aber der Daten Ergebnisse werden nicht zurückgegeben. Dies kann von unschätzbarem Wert sein, wenn Sie den Abfrageplan überprüfen, aber die resultierenden 10 GB Daten (über das Netzwerk auf Ihrem Laptop) nicht erhalten möchten oder wenn Sie ernsthaft Tests durchführen, da SSMS nur akzeptieren kann so viele Ergebnismengen von einem gegebenen "Lauf", bevor die Abfrage mit einer "zu viele Ergebnismengen" -Meldung gestoppt wird. [Hmm, überprüfen Sie mich bitte auf dieses "Abfrageplan nur" -Bit - ich denke, es tut das, aber es ist eine lange Zeit.]


13
2018-06-17 13:55



insert anothertable
Select * from Table_Name

Führt die Auswahl aus, gibt aber nichts zurück

set noexec on 
Select * from Table_Name

Analysiert, führt aber keine Ausführung aus und gibt daher nichts zurück.


6
2018-06-17 13:50



Vielleicht wollte der Interviewer eine andere Frage stellen:

Wie würden Sie eine SQL-Abfrage ausführen, ohne zurückzukehren? die Anzahl von Ergebnisse?

In diesem Fall wäre die Antwort SET NOCOUNT ON.


6
2018-06-17 15:28



Ist das Ziel, alle Zeilen zu unterdrücken? Verwenden Sie dann einen Filter, der für jede Zeile den Wert false ergibt:

SELECT * FROM Table_Name WHERE 1 = 2

2
2018-06-17 13:48



In meinem Fall habe ich getestet, dass sich die Daten in allen Ansichten, z. Alle Funktionen von cast () verursachten keine Konvertierungsfehler usw. Daher war die Unterdrückung der eigentlichen Daten keine Option, die Anzeige war nicht zu schlecht, aber ein wenig verschwendete Ressourcen und besser nicht zu diplsay, wenn Ergebnisse nur im Text gesendet werden.

Ich habe das folgende Skript erstellt, um alle Ansichten auf diese Weise zu testen. Das einzige Problem ist, wenn es auf Ansichten trifft, die text / ntext Spalten haben.

declare csr cursor local for select name from sys.views order by name
declare @viewname sysname
declare @sql nvarchar(max)

open csr
fetch next from csr into @viewname
while @@fetch_status = 0 begin
    --set @sql = 'select top 1 * from ' + @viewname 

    set @sql = 'declare @test nvarchar(max) select @test = checksum(*) from ' + @viewname 

    print @viewname

    exec sp_executesql @sql
    fetch next from csr into @viewname
end
close csr
deallocate csr

2
2017-07-31 08:35