问题描述
我大约有1000列。通过排除每个字段的空值,我们能否获得表中每一列的数字记录。 表名称查询中的sql COUNT(column_name)排除空值。但是不可能对1000列进行手动操作。请让我知道是否还有其他程序可以完成。
解决方法
以下是动态SQL的示例:
/* Param var of the table to be queried */
DECLARE @Table VARCHAR(50) = 'Misc';
/* Build a list of column names to count */
DECLARE @sql VARCHAR(MAX) = ''; -- Important to initialize to an empty string.
SELECT @sql = @sql
+ CASE WHEN LEN( @sql ) > 0 THEN ',' ELSE '' END
+ CASE TYPE_NAME( system_type_id )
WHEN 'text' THEN 'COUNT( CAST([' + [name] + '] AS varchar(1) ) ) AS [' + [name] + '_count]'
ELSE 'COUNT( [' + [name] + '] ) AS [' + [name] + '_count]'
END
FROM [sys].[columns] WHERE
[object_id] = OBJECT_ID ( @Table );
/* Complete and execute dynamic statement */
SET @sql = 'SELECT ' + @sql + ' FROM ' + @Table + ';';
EXEC( @sql );
Teradata转换: https://www.jooq.org/translate/
declare Table varchar(50) default 'tblOrders';
declare sql varchar(32000) default '';
select ((@sql + case
when length(@sql) > 0 then ','
else ''
end) + case TYPE_NAME(system_type_id)
when 'text' then (('COUNT( CAST([' + "name" + '] AS varchar(1) ) ) AS [') + "name" + '_count]')
else (('COUNT( [' + "name" + '] ) AS [') + "name" + '_count]')
end) @sql
from "sys"."columns"
where "object_id" = OBJECT_ID(@Table);
set sql = (('SELECT ' + @sql + ' FROM ') + @Table + ';');