首页 > 解决方案 > 如何将循环中的多个结果组合到一个临时表中

问题描述

我有这样的声明:

Declare @sql varchar(max) = ''
declare @tablename as varchar(255) = 'test'

select @sql = @sql + 'select [' + c.name + '],count(*) as ''' + c.name 
+  ''' from [' + t.name + ']' 
from sys.columns c
inner join sys.tables t on c.object_id = t.object_id
where t.name = @tablename

EXEC (@sql)

但它使输出出现在不同的结果窗口中,当我尝试将它与联合组合时,所有文本都不适合它。我想尝试将结果放入 SQL Server 的临时表中,无论如何我可以做到这一点吗?

我试图得到:

Column Name   Count     Distinct Count
    a              100    1
    b              100    5
    c              100    73
    d              100    9

上面的陈述不是针对不同的计数,但我希望我可以复制相同的逻辑。

标签: sqlsql-server

解决方案


我怀疑您要构建的查询看起来像:

select 'a' as column_name, count(column_name), count(distinct column_name)
from t
union all
select 'a' as column_name, count(column_name), count(distinct column_name)
from t
union all
. . .

要在 SQL Server 中构造它,您可以使用如下逻辑:

declare @q nvarchar(max);
set @q = '
    select ''[column_name]'' as column_name, count([column_name]) as cnt, count(distinct [column_name]) as distinct_count
    from [table_name]
';

declare @sql nvarchar(max);

select @sql = string_agg(replace(replace(@q,
                                         '[column_name]',
                                         quotename(column_name)
                                        ),
                                 '[table_name]',
                                 quotename(table_name)
                                ), ' union all '
                        )
from information_schema.columns c
where table_name = @name;  -- should probably check the schema too!

exec sp_executesql @sql;

推荐阅读