Nevím, jestli je to rychlejší, ale můžete použít jeden trik:FOR XML AUTO
vynechá sloupce bez obsahu:
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
Toto je výsledek:col3
chybí...
<tbl col1="1" col2="2" />
<tbl col1="1" />
<tbl />
Když to víte, můžete najít seznam sloupců, které nejsou ve všech řádcích NULL, takto:
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
Obsah @ColList
je nyní col1,col2
. Tento řetězec můžete umístit do dynamicky vytvořeného SELECT
.
AKTUALIZACE:Tipy
Bylo by velmi chytré nahradit SELECT *
se seznamem sloupců vytvořeným z INFORMATION_SCHEMA.COLUMNS
kromě všech bez možnosti null . A – pokud je to potřeba a možné – typy, které obsahují velmi velká data (BLOB).
AKTUALIZACE 2:Výkon
Nevím, jaká jsou vaše velmi velká data znamená ve skutečnosti... Zkoušel jsem to na tabulce s asi 500 000 řádky (pomocí SELECT *
) a správně se vrátil po méně než jedné minutě. Doufám, že je to dost rychlé...