Ich weiß nicht, ob das schneller geht, aber Sie könnten einen Trick anwenden:FOR XML AUTO
wird Spalten ohne Inhalt weglassen:
DECLARE @tbl TABLE(col1 INT,col2 INT,col3 INT);
INSERT INTO @tbl VALUES (1,2,NULL),(1,NULL,NULL),(NULL,NULL,NULL);
SELECT *
FROM @tbl AS tbl
FOR XML AUTO
Das ist das Ergebnis:col3
fehlt...
<tbl col1="1" col2="2" />
<tbl col1="1" />
<tbl />
Wenn Sie dies wissen, könnten Sie die Liste der Spalten, die nicht in allen Zeilen NULL sind, wie folgt finden:
DECLARE @ColList VARCHAR(MAX)=
STUFF
(
(
SELECT DISTINCT ',' + Attr.value('local-name(.)','nvarchar(max)')
FROM
(
SELECT
(
SELECT *
FROM @tbl AS tbl
FOR XML AUTO,TYPE
) AS TheXML
) AS t
CROSS APPLY t.TheXML.nodes('/tbl/@*') AS A(Attr)
FOR XML PATH('')
),1,1,''
);
SELECT @ColList
Der Inhalt von @ColList
ist jetzt col1,col2
. Diese Zeichenfolge können Sie in einem dynamisch erstellten SELECT
platzieren .
UPDATE:Hinweise
Es wäre sehr clever, das SELECT *
zu ersetzen mit einer aus INFORMATION_SCHEMA.COLUMNS
erstellten Spaltenliste ausgenommen alle nicht-nullable . Und - wenn nötig und möglich - Typen, die sehr große Daten enthalten (BLOBs).
UPDATE2:Leistung
Ich weiß nicht, was Ihre sehr großen Datenmengen sind bedeutet eigentlich ... Habe das gerade an einer Tabelle mit etwa 500.000 Zeilen versucht (mit SELECT *
) und es wurde nach weniger als einer Minute korrekt zurückgegeben. Hoffe, das ist schnell genug...