2012-10-22 15 views
5

में नल की संख्या की गणना करें मैंने एक डीबी में भाग लिया है जिसमें अत्यधिक व्यापक तालिकाएं हैं। (600+ कॉलम) बिना किसी पैरामीटर के शीर्ष 100 पंक्तियों के लिए पूछना भी 4 सेकंड लेता है। मैं इन टेबलों को थोड़ा सा पतला करना चाहता हूं।प्रत्येक कॉलम

यह पता लगाने के लिए कि कौन से कॉलम को आसानी से नई टेबल पर ले जाया जा सकता है, या पूरी तरह से हटाया जा सकता है, मैं जानना चाहता हूं कि प्रत्येक कॉलम में कितने नल हैं। यह मुझे बताएगा कि कौन सी जानकारी कम से कम महत्वपूर्ण होने की संभावना है।

मैं एक प्रश्न कैसे लिखूं जो सभी कॉलम ढूंढ सकता है और उन स्तंभों के अंदर नल को गिन सकता है?

संपादित डीबी एसक्यूएल सर्वर 2008 मैं वास्तव में अलग-अलग कॉलम में से प्रत्येक टाइप करने के लिए नहीं की उम्मीद कर रहा हूँ है। ऐसा लगता है कि sys.columns इससे मदद कर सकता है?

संपादित 2 कॉलम सभी अलग-अलग प्रकार हैं।

+2

उदा आप उन स्तंभों को ढूंढना चाहते हैं जो सभी शून्य हैं ताकि आप उन्हें छोड़ सकें? दर्दनाक, लेकिन कुछ समय से गिनती (*) का चयन करें जहां कुछ रंग शून्य है 'एक-एक-एक समय चाल चल जाएगा। –

+0

क्या कॉलम में एक ही डेटा प्रकार है? –

+0

वे एक ही प्रकार के नहीं हैं। डेटा बहुत मेल नहीं खाता है, यह ड्राइवरों के लाइसेंस नंबरों से फ़ील्ड को संबोधित करने के लिए, नकद मूल्यों तक, "किए गए वादे" जो कुछ भी है, से लेकर है। – Drigan

उत्तर

6

प्रयास करें इस

declare @Table_Name nvarchar(max), @Columns nvarchar(max), @stmt nvarchar(max) 

declare table_cursor cursor local fast_forward for 
    select 
     s.name, 
     stuff(
      (
       select 
        ', count(case when ' + name + 
        ' is null then 1 else null end) as count_' + name 
       from sys.columns as c 
       where c.object_id = s.object_id 
       for xml path(''), type 
      ).value('data(.)', 'nvarchar(max)') 
     , 1, 2, '') 
    from sys.tables as s 

open table_cursor 
fetch table_cursor into @Table_Name, @Columns 

while @@FETCH_STATUS = 0 
begin 
    select @stmt = 'select ''' + @Table_Name + ''' as Table_Name, ' + @Columns + ' from ' + @Table_Name 

    exec sp_executesql 
     @stmt = @stmt 

    fetch table_cursor into @Table_Name, @Columns 
end 

close table_cursor 
deallocate table_cursor 
+0

मुझे अपने सिर को लपेटने के लिए कुछ समय लगता है कि आपने वहां क्या किया था, लेकिन यह अब तक अच्छा दिखता है। :) – Drigan

+0

अब मैं इसे समझता हूं, यह कमाल है! धन्यवाद! – Drigan

2
select count(case when Column1 is null then 1 end) as Column1NullCount, 
    count(case when Column2 is null then 1 end) as Column2NullCount, 
    count(case when Column3 is null then 1 end) as Column3NullCount, 
    ... 
from MyTable 
+0

मैं * वास्तव में * 688 कॉलम में अलग-अलग टाइपिंग से बचने की उम्मीद कर रहा हूं। । । शायद sys.columns उपयोग योग्य होगा? – Drigan

+0

आप उन्हें क्यों टाइप करेंगे? कॉलम नाम प्राप्त करना आसान होना चाहिए (उदा।, MyTable से चुनें * जहां 1 = 0'), आपके डेटाबेस के आधार पर। फिर यह करने के लिए पाठ-संपादक का एक छोटा सा काम है। ऐसा करने के लिए गतिशील क्वेरी लिखने से शायद तेज़। – RedFilter

+0

मुझे लगता है कि मैं थोड़ा और लालित्य की उम्मीद कर रहा हूं क्योंकि कई टेबल हैं जो 100 से अधिक कॉलम हैं। अगर मेरे पास नहीं है तो दुनिया का अंत नहीं है, लेकिन यह * थोड़ा और समय लगेगा। – Drigan

संबंधित मुद्दे