2012-10-22 95 views
5

我遇到了表格過寬的數據庫。 (600列以上)甚至要求沒有參數的前100行需要4秒。我想稍微減少這些表格。計算每列中的空值數

要確定哪些列最容易移動到新表中或完全刪除,我想知道每列中有多少個空值。這應該告訴我哪些信息可能是最不重要的。

我該如何編寫一個查詢,可以查找所有列並計算這些列內的空值?

編輯的DB在SQL Server 2008。我真的希望不單獨鍵入每個列。它看起來像sys.columns可以幫助這個?

編輯2列是所有不同的類型。

+2

例如你想找到全是空的列,所以你可以放下它們?痛苦的,但'從某些列中選擇count(*),其中somecolumn是空的'一次只能做一次。 –

+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

你爲什麼要輸入它們?根據你的數據庫,獲取列名應該很簡單(例如,'select * from MyTable where 1 = 0')。然後完成一些文本編輯工作。可能比編寫動態查詢更快。 – RedFilter

+0

我想我希望多一點優雅,因爲有好幾張桌子超過100列。不是世界末日,如果我沒有它,但它*會花費更多的時間。 – Drigan