5

幅が広すぎるテーブルがあるDBに遭遇しました。(600以上の列)パラメーターなしで上位100行を要求する場合でも、4秒かかります。これらのテーブルを少しスリムにしたいと思います。

どの列を新しいテーブルに最も簡単に移動できるか、または完全に削除できるかを把握するために、各列に含まれるnullの数を知りたいと思います。これにより、どの情報が最も重要でないと思われるかがわかります。

すべての列を検索し、それらの列内のnullをカウントできるクエリを作成するにはどうすればよいですか?

編集DBはSQLServer2008です。各列を個別に入力しないことを本当に望んでいます。sys.columnsがこれに役立つように見えますか?

Edit2列はすべて異なるタイプです。

4

2 に答える 2

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
于 2012-10-22T19:05:52.923 に答える
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
于 2012-10-22T18:53:53.507 に答える