T-SQL Как считать записи для каждого столбца - PullRequest
1 голос
/ 15 августа 2011

У меня есть таблица с более чем 120 столбцами, и мне нужно определить, какой столбец используется меньше всего. Я пытался использовать sql запросы для этого, но нашел T-SQL немного проще.

Я попробовал следующее, но мой счетчик равен 0 для каждого столбца.

Declare  data1 Cursor for select column_name 
        from information_schema.columns 
        where table_name = 'repository' 

Declare @mField nvarchar(255)
Declare @count int

Open data1;

fetch next from  data1 into @mField;

set @count = -1;

while @@fetch_status = 0  
    begin
         select   @count = count(@mField)
                    from  repository where tablereference = 
                    'central' and ( @mField!= null )

        print @mField+' ' ; 
                  print @count;
        Fetch next from  data1 into @mField;
    end

close data1;
deallocate data1;

Ответы [ 4 ]

3 голосов
/ 15 августа 2011

Вы не можете считать такие значения, потому что вы тестируете, только если @mField равен NULL. Имя столбца не подставляется.

COUNT в любом случае игнорирует NULL, поэтому, если вы хотите считать ненулевые значения, сделайте следующее:

DECLARE @sql varchar(4000)

SET @sql = 'SELECT COUNT(*) AS Total '

SELECT @sql = @sql + ', COUNT(' +  QUOTENAME(column_name) + ') AS ' + QUOTENAME(column_name)
from information_schema.columns 
where table_name = 'repository'

SET @sql = @sql + ' FROM repository'

EXEC (@sql)

Это запрашивает таблицу один раз для всех столбцов

1 голос
/ 15 августа 2011

Вам нужно использовать динамический sql в середине, чтобы достичь своей цели здесь.

    Declare  data1 Cursor for select column_name 
            from information_schema.columns 
            where table_name = 'repository' 

    Declare @mField nvarchar(255)


    Open data1;

    fetch next from  data1 into @mField;


    while @@fetch_status = 0  
    begin
        exec ('

            declare @count int

            select @count = count([' + @mField + '])
                        from  repository  where tablereference = 
                    ''central'' and ( [' + @mField + '] is not null)                                    

            if @count < 10
            begin
                print ''' + @mField + ' '' ; 
                print @count;
            end         
        ')
        Fetch next from  data1 into @mField;
    end

close data1;
deallocate data1;
1 голос
/ 15 августа 2011

Ваш count(@mField) является счетчиком буквального значения, которое находится в @mField, его не , разрешающего имя поля в COUNT(fldBlah), для этого вам нужно будет использовать динамический SQL.

Declare data1 Cursor FAST_FORWARD for select column_name 
        from information_schema.columns where table_name = 'repository' 

Declare @mField nvarchar(255)
Declare @SQL varchar(1024)
Declare @results table (col_name varchar(128), non_nulls int)

Open data1;
fetch next from data1 into @mField;

while (@@FETCH_STATUS = 0) begin
    set @SQL = 'SELECT ''' + @mField + ''', count(' + @mField + ') from repository where tablereference =  ''central'''
    insert @results
               exec(@SQL)
    Fetch next from data1 into @mField;
end

close data1;
deallocate data1;

select * from @results

Для вывода типа;

col_name            non_nulls
[tablereference]    5
[another_col]       1

Там, где в столбце есть 5 ненулевых значений

0 голосов
/ 15 августа 2011

Вам нужно использовать IS NOT NULL вместо != NULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...