You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:27:47