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. SQLでの整数としての出力の選択/キャスト

    2. 8k列の値をRからCLOB列にプッシュするためのヘルプが必要(Oracle)

    3. SQLのネストされた順序?

    4. row_number()を使用してテーブルから重複レコードを削除する必要があります