Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dynamiczny SQL z pętlą po wszystkich kolumnach w tabeli

Oto przykład pracy z wszystkimi sugestiami w komentarzach.

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;

Przykład SQLFiddle (zauważ, że pokazuje to tylko pierwszą iterację przez kursor. Nie jestem pewien, czy jest to ograniczenie SQLFiddle, czy błąd).

Prawdopodobnie przechowałbym wyniki w osobnej bazie danych, gdybym to robił. Ponadto prawdopodobnie umieściłbym bity budujące SQL w funkcjach zdefiniowanych przez użytkownika w celu utrzymania ich (powolny bit będzie uruchamiał zapytania, nie ma sensu optymalizować ich generowania).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między skanowaniem tabeli a skanowaniem indeksu klastrowego?

  2. Błąd importu pliku CSV:Wartość kolumny zawierająca ogranicznik kolumny

  3. Wyświetl listę wszystkich baz danych z serwera połączonego w programie SQL Server (przykłady T-SQL)

  4. Dlaczego SQL Server ignoruje wartości w konkatenacji ciągów, gdy określono klauzulę ORDER BY?

  5. Jak zrzucić wszystkie nasze obrazy z pola VARBINARY(MAX) w SQL Server 2008 do systemu plików?