2012-12-07 10 views
5

Wie kann ich die Anzahl der von einer SQL-Abfrage mit SQL Server zurückgegebenen Spalten ermitteln?Anzahl der von einer Abfrage zurückgegebenen Spalten ermitteln

Zum Beispiel, wenn ich eine Abfrage wie folgt haben:

SELECT * 
FROM A1, A2 

Es sollte die Gesamtzahl der Spalten in der Tabelle A1 + Gesamtzahl der Spalten in der Tabelle A2 zurück. Aber die Abfrage könnte komplizierter sein.

+3

Aus Neugier, warum wollen Sie die Gesamtzahl der Spalten? Außerdem sollten Sie die richtige Joinsyntax anstelle von impliziten Joins in der where-Klausel verwenden. –

+0

Es gibt einige Legacy-Code, mit denen ich arbeiten muss und ich muss an anderer Stelle überprüfen, wie viele Spalten zurückgegeben wird. Es ist mehr wie ein Debugging-Problem –

+0

Ich brauche nicht die Anzahl der Datensätze, ich brauche nur die Gesamtzahl der zurückgegebenen Spalten –

Antwort

7

Hier ist eine Methode:

select top 0 
into _MYLOCALTEMPTABLE 
from (your query here) t 

select count(*) 
from Information_Schema.Columns c 
where table_name = '_MYLOCALTEMPTABLE' 

Sie etwas ähnliches, indem Sie eine Ansicht tun.

1

Hässliche ich weiß:

SELECT COUNT(*) + 
(
    SELECT COUNT(*) 
    FROM information_schema.columns 
    WHERE table_name = 'A1' 
) 
FROM information_schema.columns 
WHERE table_name = 'A2' 
+3

Die Frage bezieht sich speziell auf eine Abfrage und nicht auf eine Tabelle, also dies Beantwortet die Frage nicht. –

+0

Es gibt mehrere verschiedene Abfragen, die ich erfahren möchte, wie viele Spalten sie zurückgeben, nicht nur diese spezifische Beispielabfrage. –

2

Versuchen Sie dies;

--Insert into a temp table (this could be any query) 
SELECT * 
INTO #temp 
FROM [yourTable] 

--Select from temp table 
SELECT * FROM #temp 

--List of columns 
SELECT COUNT(name) NumOfColumns FROM tempdb.sys.columns WHERE object_id = 
object_id('tempdb..#temp'); 

--drop temp table 
DROP TABLE #temp 
6

Sie nicht angeben, der SQL Server-Version, aber ich gehe davon aus 2012. Es ist nicht jedoch zukünftige Leser dieser Frage könnte auf 2012+ so dass ich für sie diese Antwort veröffentlichen.

SQL Server 2012 bietet eine Reihe von Verfahren, um mehr Metadaten zu Abfragen und Parametern bereitzustellen. In diesem Fall liefert die gespeicherte Prozedur sp_describe_first_result_set eine handliche Tabellenform.

Es gibt auch eine DMO-Funktion, sys.dm_exec_describe_first_result_set, Ähnliche Inhalte zu schaffen, das ist das, was Sie in Ihrem Beispiel verwenden wollen würden

DECLARE 
    -- Your query goes here 
    @query nvarchar(4000) = N'SELECT * FROM mdm.tblStgBatch AS TSB'; 

-- Tabular results 
EXECUTE sys.sp_describe_first_result_set @tsql = @query; 

-- Simple column count 
SELECT 
    COUNT(1) AS column_count 
FROM 
    sys.dm_exec_describe_first_result_set(@query, NULL, 0); 

Die neuen Metadata Discovery-Optionen FMTONLY ersetzen, das ist, wie man würde lösen Dieses Problem vor 2012. Meine TSQL-Chops sind anscheinend nicht stark genug, um irgendetwas Nützliches damit zu tun, und stattdessen müsste ich in eine .NET-Sprache ausweichen, um mit der Ausgabe von FMTONLY zu arbeiten.

SET FMTONLY ON; 
SELECT * 
FROM A1, A2; 
SET FMTONLY OFF; 
+1

Dies war ein Lebensretter in meinem Fall, da ich SELECT INTO mit meiner Abfrage nicht verwenden kann, um eine Tabelle zu analysieren. Vielen Dank! –

Verwandte Themen