Saya tidak tahu apakah ini lebih cepat, tetapi Anda dapat menggunakan satu trik:FOR XML AUTO
akan menghilangkan kolom tanpa konten:
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
Ini hasilnya:col3
hilang...
<tbl col1="1" col2="2" />
<tbl col1="1" />
<tbl />
Mengetahui hal ini, Anda dapat menemukan daftar kolom, yang tidak NULL di semua baris, seperti ini:
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
Isi @ColList
sekarang col1,col2
. String ini dapat Anda tempatkan dalam SELECT
yang dibuat secara dinamis .
PERBARUI:Petunjuk
Akan sangat pintar, untuk mengganti SELECT *
dengan daftar kolom yang dibuat dari INFORMATION_SCHEMA.COLUMNS
mengecualikan semua tidak-nullable . Dan - jika diperlukan dan memungkinkan - jenis, yang berisi data sangat besar (BLOB).
UPDATE2:Performa
Tidak tahu apa data Anda yang sangat besar berarti sebenarnya... Baru saja mencoba ini di atas meja dengan sekitar 500.000 baris (dengan SELECT *
) dan itu kembali dengan benar setelah kurang dari satu menit. Semoga, ini cukup cepat...