在SAS Enterprise Guide中导出所有数据库表的行数统计
批量获取ODBC连接中所有表的行数
看起来你已经搞定了单表行数查询和表列表导出,现在就差把这俩结合起来批量处理啦!我给你两种可行的方案,你可以根据自己的ODBC数据源类型和需求选择:
方案一:通用批量执行COUNT查询(适用于所有ODBC兼容数据库)
这个方法先获取所有用户表的列表,然后动态生成COUNT(*)查询语句并批量执行,最后合并结果。
步骤1:获取有效用户表列表
首先从ODBC数据源中筛选出真正的用户表(排除视图、系统表等):
proc sql; connect to odbc as sql1 (dsn=EDWQA user=XXXX pw=XXXX readbuff=300); /* 利用SQLTables获取表信息,过滤出类型为TABLE的用户表 */ create table user_tables as select TABLE_SCHEM as schema_name, TABLE_NAME as table_name from connection to sql1 ( odbc::SQLTables('', '', '', 'TABLE') ); disconnect from sql1; quit;
步骤2:生成动态SQL并批量查询行数
通过SAS宏变量拼接所有表的COUNT查询,再一次性执行:
/* 将每个表的COUNT查询拼接成UNION ALL的语句 */ proc sql noprint; select cats( "SELECT '", schema_name, "' AS schema_name, ", "'", table_name, "' AS table_name, ", "COUNT(*) AS row_count FROM ", schema_name, ".", table_name ) into :count_queries separated by ' UNION ALL ' from user_tables; quit; /* 执行动态SQL,获取所有表的行数结果 */ proc sql; connect to odbc as sql1 (dsn=EDWQA user=XXXX pw=XXXX readbuff=300); create table table_row_counts as select * from connection to sql1 (&count_queries.); disconnect from sql1; quit;
注意:如果你的表名或 schema 名包含特殊字符(比如空格、关键字),需要给表名加上数据库对应的引号,比如SQL Server用[],Oracle用"",可以修改拼接逻辑:
/* 以SQL Server为例,给表名加[] */ select cats( "SELECT '", schema_name, "' AS schema_name, ", "'", table_name, "' AS table_name, ", "COUNT(*) AS row_count FROM [", schema_name, "].[", table_name, "]" ) into :count_queries separated by ' UNION ALL ' from user_tables;
方案二:利用数据库系统视图(高效推荐,适用于特定数据库)
如果你的ODBC数据源是SQL Server、Oracle、MySQL这类主流数据库,直接查询系统元数据视图会比逐个执行COUNT(*)快得多,尤其是表很多或者数据量很大的时候。
示例:SQL Server数据源
proc sql; connect to odbc as sql1 (dsn=EDWQA user=XXXX pw=XXXX readbuff=300); create table table_row_counts as select s.name as schema_name, t.name as table_name, sum(p.rows) as row_count from connection to sql1 ( sys.schemas s inner join sys.tables t on s.schema_id = t.schema_id inner join sys.partitions p on t.object_id = p.object_id where p.index_id in (0, 1) /* 0=堆表,1=聚集索引,避免重复统计 */ group by s.name, t.name ); disconnect from sql1; quit;
示例:Oracle数据源
proc sql; connect to odbc as sql1 (dsn=EDWQA user=XXXX pw=XXXX readbuff=300); create table table_row_counts as select owner as schema_name, table_name, num_rows as row_count from connection to sql1 ( all_tables where owner = 'ACCTLOAD' /* 可指定特定schema,去掉则查所有 */ ); disconnect from sql1; quit;
注意:系统视图返回的行数可能不是实时的,比如Oracle的num_rows需要执行ANALYZE TABLE才会更新,SQL Server的sys.partitions是相对实时的,但如果有大量数据变动可能略有延迟。
内容的提问来源于stack exchange,提问作者cartoom02
相关产品推荐
相关产品推荐

