代码之家  ›  专栏  ›  技术社区  ›  Mark A

如何在我的SQL Server数据库架构中找到所有100%为空的列?

  •  6
  • Mark A  · 技术社区  · 14 年前

    有没有一种SQL方法可以找出我的模式中哪些列完全充满了空值?我知道有几个表中的一些字段不被应用程序使用,将被删除,但我想看看是否有一种自动化的方法/脚本在整个数据库中找到这些字段,以便找到代码审阅/可能删除的候选字段。

    如果重要,请在x86上运行SQL Server 2005。

    提前谢谢!

    3 回复  |  直到 14 年前
        1
  •  8
  •   Joe Stefanelli    14 年前
    create table #SuspectColumns (
        TABLE_SCHEMA sysname,
        TABLE_NAME sysname,
        COLUMN_NAME sysname
    )
    
    declare csrColumns cursor fast_forward for
        select TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME
            from INFORMATION_SCHEMA.COLUMNS
            where IS_NULLABLE = 'YES'
    
    declare @TABLE_SCHEMA sysname,
            @TABLE_NAME sysname,
            @COLUMN_NAME sysname,
            @sql nvarchar(max)  
    
    open csrColumns
    
    while (1=1) begin
        fetch next
            from csrColumns
            into @TABLE_SCHEMA, @TABLE_NAME, @COLUMN_NAME
    
        if @@FETCH_STATUS<>0 break
    
        set @sql = N'if not exists(select 1 from ' + QUOTENAME(@TABLE_SCHEMA) + N'.' + QUOTENAME(@TABLE_NAME) + N' where ' + QUOTENAME(@COLUMN_NAME) + N'is not null)
                         insert into #SuspectColumns values (''' + @TABLE_SCHEMA + N''',''' + @TABLE_NAME + N''',''' + @COLUMN_NAME + N''')'
    
        exec sp_executesql @sql
    end /* while */
    
    close csrColumns
    deallocate csrColumns
    
    select * from #SuspectColumns
    
    drop table #SuspectColumns
    
        2
  •  0
  •   Beth    14 年前

    您可以返回max(列)并检查是否为空

        3
  •  0
  •   NullPointerException    14 年前

    DECLARE @table_columns TABLE
    (
      table_name nvarchar(128),
      column_name nvarchar(128)
    );
    DECLARE @table_name nvarchar(128);
    DECLARE @column_name nvarchar(128);
    
    INSERT INTO @table_columns(table_name, column_name)
    select TABLE_NAME, COLUMN_NAME from INFORMATION_SCHEMA.columns;
    
    while (select count(*) from @table_columns) > 0
    begin
        select top 1 @table_name = table_name, @column_name = column_name from @table_columns
        exec('SELECT ''' + @table_name + ''' as table_name, ''' + @column_name + ''' as column_name WHERE NOT EXISTS (SELECT TOP 1 * FROM ' + @table_name + ' WHERE ' + @column_name + ' IS NOT NULL)')
        delete from @table_columns where table_name = @table_name and column_name = @column_name 
    end