如何查找数据库中的所有空列

时间:2018-04-04 15:42:45

标签: sql-server

任何人都可以帮我找到sql server数据库中的所有空列我是sql server的新手。

我在oracle数据库中编写了一个查询,如下所示,但我不知道如何在sql server中编写相同的东西

SET serveroutput ON;
        DECLARE
          v_count      NUMBER;
          CURSOR c2
          IS
            SELECT Column_name FROM all_tab_columns WHERE table_name= 'A';
        BEGIN
          FOR r1 IN c2
          LOOP
            EXECUTE immediate 'SELECT COUNT('||r1.column_name||') FROM HR'||'.'||'A' INTO v_count ;
            IF v_count =0 THEN
              dbms_output.put_line('Column'||' '||r1.column_name||' '||'is'||' '||v_count);
            END IF;
          END LOOP;
END;

2 个答案:

答案 0 :(得分:1)

以下是您要找的内容:

-- Returns a list of all columns in current database
-- where the column's value is null for all records.
declare @tempTable TABLE
(
    TableSchema nvarchar(256),
    TableName nvarchar(256),
    ColumnName sysname,
    NotNullCnt bigint
);

declare @sql nvarchar(4000);
declare @tableSchema nvarchar(256);
declare @tableName nvarchar(256);
declare @columnName sysname;
declare @cnt bigint;

declare columnCursor cursor FOR
    SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
    WHERE IS_NULLABLE = 'YES';

open columnCursor;

fetch next FROM columnCursor INTO @tableSchema, @tableName, @columnName;

while @@FETCH_STATUS = 0
begin
    -- use dynamic sql to get count of records where column is not null
    SET @sql = 'select @cnt = COUNT(*) from [' + @tableSchema + '].[' + @tableName +
        '] where [' + @columnName + '] is not null';
    -- print @sql; --uncomment for debugging
    exec sp_executesql @sql, N'@cnt bigint output', @cnt = @cnt output;

    INSERT INTO @tempTable SELECT @tableSchema, @tableName, @columnName, @cnt;

    fetch next FROM columnCursor INTO @tableSchema, @tableName, @columnName;
end

close columnCursor;
deallocate columnCursor;

SELECT * FROM @tempTable WHERE NotNullCnt = 0;

在sql server 2008中测试代码并正常工作。

参考:http://snipplr.com/view/30313/

答案 1 :(得分:0)

它在SQL Server中非常相似,虽然我不会使用游标:

DECLARE @sql NVARCHAR(MAX)

SELECT @sql = ISNULL(@sql + 'UNION ALL', '') + '
SELECT ''' + TABLE_SCHEMA + '.' + TABLE_NAME + '.' + COLUMN_NAME + ''' AS col FROM ' + TABLE_SCHEMA + '.' + TABLE_NAME + ' HAVING COUNT(' + COLUMN_NAME + ') = 0
'
FROM INFORMATION_SCHEMA.COLUMNS

EXEC (@SQL)