Не знам дали това е по-бързо, но може да използвате един трик:FOR XML AUTO
ще пропусне колони без съдържание:
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
Това е резултатът:col3
липсва...
<tbl col1="1" col2="2" />
<tbl col1="1" />
<tbl />
Като знаете това, можете да намерите списъка с колони, които не са NULL във всички редове, по следния начин:
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
Съдържанието на @ColList
сега е col1,col2
. Този низ можете да поставите в динамично създаден SELECT
.
АКТУАЛИЗАЦИЯ:Съвети
Би било много умно да замените SELECT *
със списък с колони, създаден от INFORMATION_SCHEMA.COLUMNS
с изключение на всички not-null . И - ако е необходимо и възможно - типове, които съдържат много големи данни (BLOB).
АКТУАЛИЗАЦИЯ 2:Производителност
Не знам какви са вашите много големи данни всъщност означава... Току-що опитах това на таблица с около 500 000 реда (с SELECT *
) и се върна правилно след по-малко от една минута. Надяваме се, това е достатъчно бързо...