Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wählen Sie nicht leere Spalten mit SQL Server aus

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...