2012-04-06 8 views
4

Gibt es eine Möglichkeit, die Spalten abzurufen, die eine SQL-Abfrage zurückgeben würde, ohne eine SQL-Anweisung auszuführen?Abrufen von zurückgegebenen Spalten aus SQL-Anweisung

Ich schaute in Verwendung set showplan_all on und Verwendung der OutputList Feld, aber die Ergebnisse waren nicht ganz das, was ich wollte. Ich brauche die Spalten in der richtigen Reihenfolge und den richtigen Spaltennamen (wenn sie Aliasing sind oder nicht).

Ich verwende SQL Server 2008 R2.

Um zu klären, hier ist ein Beispiel für eine Abfrage, die ausgeführt werden könnten:

--log that the user has executed a query 
insert into execution_log_table 
(timestamp 
,user_id 
,report_id) 
values (CURRENT_TIMESTAMP 
,1234 
,5678) 

select * 
from (select column1 
,column2 
from another_table) tbl 

Ich würde nichts in die erste Tabelle eingefügt werden soll, wenn die Spalten zurückgegeben zu bekommen versuchen.

* Hinweis: Dies ist nur ein einfaches Beispiel, ich habe einige SQL-Anweisungen, die Hunderte von Zeilen Code sind, die mehrere Crud-Operationen ausführen. Ich weiß, dass ich versuchen könnte, die Codezeilen manuell zu analysieren, aber meine Frage wurde an eine Methode gerichtet, die den SQL-Server-Parser verwendet, um zu bestimmen, welche Spalten in der endgültigen select-Anweisung zurückgegeben würden.

+0

Liegt diese Frage im Zusammenhang mit der Verwendung von SqlBulkCopy? – Phil

+0

Nein, ich habe eine Reporting-Anwendung, die davon profitieren würde, die Spalten abrufen zu können, ohne die SQL-Anweisung ausführen zu müssen. – ChandlerPelhams

Antwort

1

SET FMTONLY ON. Es „gibt“ leere Ergebnismengen, sollten aber keine tatsächlichen Tabellen beeinflussen:

set fmtonly on 
go 
insert into execution_log_table 
([timestamp] 
,user_id 
,report_id) 
values (CURRENT_TIMESTAMP 
,1234 
,5678) 

select * 
from (select column1 
,column2 
from another_table) tbl 

By the way, erinnern, um sie auszuschalten, bevor die gleiche Verbindung für andere Aktivitäten verwendet wird (Verwendung SET FMTONLY OFF in seiner eigenen Charge), sonst können Sie sich für eine Weile verwirren. (Wie ich es bei dem Versuch getan habe, Tabellen zu erstellen, um Ihre Batch-Anweisungen zu testen, vergessend, dass die CREATE TABLE s selbst stört (mit Erfolgsmeldungen) einmal FMTONLY war).


Ich habe gerade bemerkt, dass diese Funktion als veraltet zu sein scheint, und der Austausch können Sie nur Informationen über die ersten Ergebnismenge abzurufen. Was nützt , dass angesichts komplexer Abfragen?

+0

Ich benutze immer noch 2008 R2, eine Version, die nicht abgeschrieben wird, also wird dies für mich großartig funktionieren (zumindest für die vorhersehbare Zukunft). Genau das habe ich gesucht. Vielen Dank! – ChandlerPelhams

1

Ich glaube nicht, das möglich ist, aber man kann sicherlich etwas tun, wie

select <column list> 
    ... blah blah 
    where 1=0 

, um die Form des Ergebnisses ohne Ergebnis eingestellt zu erhalten.

Sie müssen eine Abfrage ausführen, aber die Ausführungszeit wäre minimal.

+0

Natürlich ist die wirklich triviale Lösung, nur die Spalten anzugeben, die die Abfrage ausgibt. – lyrisey

+0

Dies wird nicht funktionieren, weil der SQL-Code nicht rechtzeitig bekannt sein wird. Es kann mehrere Anweisungen enthalten, die Daten vor der endgültigen Auswahl einfügen/aktualisieren können. – ChandlerPelhams

+0

Können Sie die endgültige Auswahl nicht ausrechnen? – Phil

Verwandte Themen