5

我遇到了一个表过宽的数据库。(600 多列)即使在没有参数的情况下查询前 100 行也需要 4 秒。我想把这些桌子缩小一点。

为了弄清楚哪些列可以最容易地移动到新表或完全删除,我想知道每列中有多少空值。这应该告诉我哪些信息可能最不重要。

我将如何编写一个可以找到所有列并计算这些列中的空值的查询?

编辑数据库是 SQL server 2008。我真的希望不要单独键入每一列。看起来 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 回答