Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Seleziona colonne non vuote usando SQL Server

Non so se sia più veloce, ma potresti usare un trucco:FOR XML AUTO ometterà le colonne senza contenuto:

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

Questo è il risultato:col3 manca...

<tbl col1="1" col2="2" />
<tbl col1="1" />
<tbl />

Sapendo questo, potresti trovare l'elenco delle colonne, che non sono NULL in tutte le righe, come questo:

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

Il contenuto di @ColList ora è col1,col2 . Questa stringa puoi inserire in un SELECT creato dinamicamente .

AGGIORNAMENTO:Suggerimenti

Sarebbe molto intelligente sostituire SELECT * con un elenco di colonne creato da INFORMATION_SCHEMA.COLUMNS esclusi tutti i non annullabili . E - se necessario e possibile - tipi, che contengono dati molto grandi (BLOB).

AGGIORNAMENTO2:Rendimento

Non so quali siano i tuoi dati molto grandi significa in realtà ... Ho appena provato questo su una tabella con circa 500.000 righe (con SELECT * ) ed è tornato correttamente dopo meno di un minuto. Spero che sia abbastanza veloce...