2012-10-22 12 views
5

テーブルが広すぎるDBを実行しました。 (600+列)パラメータを持たない最上位100行を要求する場合でも4秒かかります。私はこれらのテーブルを少しスリムにしたいと思います。各列のヌル数をカウントしてください

どの列が新しい表に最も簡単に移動できるか、または完全に削除できるかを調べるために、各列にいくつのNULLがあるかを知りたいと思います。これは、どの情報が最も重要でない可能性が高いかを教えてくれるはずです。

どのようにすべての列を検索し、それらの列の中のNULLを数えることができるクエリを記述しますか?

編集 DBは、私が個別に各列を入力しないように願って本当にだSQLサーバー2008年です。 sys.columnsがこれを助けることができるようですか?

Edit2列はすべて異なる種類です。

+2

をお試しくださいすべてnullである列を探して、ドロップするだけです。痛いですが、somecolumnがnullのsometableから 'select count(*)を1つずつ選択すると、そのトリックが実行されます。 –

+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

関連する問題