मुझे नहीं पता कि यह तेज़ है या नहीं, लेकिन आप एक तरकीब का उपयोग कर सकते हैं: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
. से बनाई गई कॉलम सूची के साथ सभी को छोड़कर अशक्त नहीं . और - यदि आवश्यक हो और संभव हो - प्रकार, जिनमें बहुत बड़ा डेटा (बीएलओबी) होता है।
अद्यतन2:प्रदर्शन
पता नहीं आपका बहुत बड़ा डेटा . क्या है वास्तव में इसका मतलब है ... बस इसे लगभग 500,000 पंक्तियों वाली तालिका पर आजमाया (SELECT *
. के साथ) ) और यह एक मिनट से भी कम समय के बाद सही ढंग से वापस आ गया। आशा है, यह काफी तेज़ है...