Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Динамичен SQL с цикъл върху всички колони в таблица

Ето пример за обработка на всички предложения в коментарите.

declare @sql nvarchar(max);
declare stat_cursor cursor local fast_forward for
select
    case when x.name not in ('date', 'datetime2', 'smalldatetime', 'datetime') then

N'select
    ' + quotename(s.name, '''') + ' as schema_name,
    ' + quotename(t.name, '''') + ' as table_name,
    ' + quotename(c.name) + ' as column_name,
    count(*) qty
from
    ' + quotename(s.name) + '.' + quotename(t.name) + '
group by 
    ' + quotename(c.name) + '
order by 
    qty desc;'

    else

N'select
    ' + quotename(s.name, '''') + ' as schema_name,
    ' + quotename(t.name, '''') + ' as table_name,
    year(' + quotename(c.name) + ') as column_name,
    count(*) qty
from
    ' + quotename(s.name) + '.' + quotename(t.name) + '
group by 
    year(' + quotename(c.name) + ')
order by 
    qty desc;'

    end

from
    sys.schemas s
        inner join
    sys.tables t
        on s.schema_id = t.schema_id
        inner join
    sys.columns c
        on c.object_id = t.object_id
        inner join
    sys.types x
        on c.system_type_id = x.user_type_id
where
    x.name not in (
        'geometry',
        'geography',
        'hierarchyid',
        'xml',
        'timestamp',
        'bit',
        'image',
        'text',
        'ntext'
    );

open stat_cursor;

fetch next from stat_cursor into @sql;

while @@fetch_status = 0
begin
    exec sp_executesql @sql;
    fetch next from stat_cursor into @sql;
end;

close stat_cursor;
deallocate stat_cursor;

Пример SQLFiddle (обърнете внимание, че това показва само първата итерация през курсора. Не съм сигурен дали това е ограничение на SQLFiddle или грешка).

Вероятно щях да скрия резултатите в отделна база данни, ако правех това. Също така, вероятно бих поставил битовете за изграждане на SQL в дефинирани от потребителя функции за поддръжка (бавният бит ще изпълнява заявките, няма смисъл да оптимизирам генерирането им).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка 0xc0202049:Задача на потока от данни 1:Неуспешно вмъкване в колоната само за четене

  2. Как мога да ускоря този индексиран изглед?

  3. Не може да се свърже с SQL SERVER 2000

  4. Поддръжка на Spotlight Cloud за съобщение за Azure SQL DB (предварителен преглед)

  5. Не може да се вмъкне запис от съхранена процедура, извикана от уеб услуга