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