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

如何为月度执行的SAS代码添加库表更新状态校验条件?

改进SAS自动执行宏%Execution以添加表更新检查逻辑

需求说明

原SAS宏%Execution仅通过日期判断是否执行(每月1日,若1日为周一则顺延至周二),现需补充两项功能:

  • 校验元数据中依赖表的状态,确保后续SAS代码可正常运行
  • 执行前检查目标库表当日是否已更新,若已更新则输出提示并跳过执行,否则执行核心代码

修改后的宏代码

%macro Execution;
%let current_date = %sysfunc(today());
%let check_date = %sysfunc(datepart(%sysfunc(datetime()))); /* 获取当日日期 */

/* 1. 日期判断逻辑:每月1日(若1日为周一则周二执行) */
%if (%sysfunc(weekday(&current_date.))=2 and %sysfunc(day(&current_date.))=1) OR
    (%sysfunc(weekday(&current_date.))=3 and %sysfunc(day(&current_date.))=1) 
%then %do;
    %put "开始执行前置检查...";

    /* 2. 检查元数据中依赖表的存在性与可用性 */
    %let dep_tables = LS.RECAP FALO.PERTS; /* 定义依赖表列表 */
    %let table_check_pass = 1;
    %do i = 1 %to %sysfunc(countw(&dep_tables.));
        %let curr_table = %scan(&dep_tables., &i.);
        %if %sysfunc(exist(&curr_table.)) = 0 %then %do;
            %put "ERROR: 依赖表 &curr_table. 不存在,无法执行后续代码!";
            %let table_check_pass = 0;
            %goto exit_check; /* 终止检查流程 */
        %end;
        %else %do;
            %put "INFO: 依赖表 &curr_table. 状态正常";
        %end;
    %end;
    %exit_check:

    /* 3. 检查目标表当日是否已更新 */
    %let target_tables = TAB TVA; /* 定义目标表列表 */
    %let already_updated = 0;
    %if &table_check_pass. = 1 %then %do;
        %do i = 1 %to %sysfunc(countw(&target_tables.));
            %let curr_target = %scan(&target_tables., &i.);
            /* 获取目标表的最后修改日期 */
            proc sql noprint;
                select datepart(crdate) into :last_modified
                from dictionary.tables
                where libname = upcase("%scan(&curr_target., 1, .)") 
                  and memname = upcase("%scan(&curr_target., 2, .)");
            quit;
            %if &last_modified. = &check_date. %then %do;
                %put "INFO: 目标表 &curr_target. 今日已更新,无需重复执行";
                %let already_updated = 1;
            %end;
        %end;
    %end;

    /* 4. 最终执行逻辑 */
    %if &table_check_pass. = 1 and &already_updated. = 0 %then %do;
        %put "Le programme est en cours d'exécution ";
        data TAB;
            set LS.RECAP;
        run;
        data TVA;
            set FALO.PERTS;
        run;
        /* ALL CODE......... */
    %end;
    %else %if &already_updated. = 1 %then %do;
        %put "提示:部分或全部目标表今日已更新,无需执行";
    %end;
    %else %do;
        %put "提示:依赖表检查未通过,终止执行";
    %end;
%end;
%else %do;
    %put " Aucune exécution nécessaire.";
%end;
%mend Execution;

关键逻辑解释

  • 依赖表状态检查:通过%sysfunc(exist())函数校验依赖表是否存在,若任意表不存在则终止执行并输出错误信息
  • 目标表更新检查:查询dictionary.tables系统表获取表的创建/最后修改日期,与当日日期对比,判断是否已更新
  • 分支逻辑优化:新增多层条件判断,确保仅在依赖表正常且目标表未更新时才执行核心代码,其余情况输出对应提示

内容的提问来源于stack exchange,提问作者nadal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:30:20