如何为月度执行的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(¤t_date.))=2 and %sysfunc(day(¤t_date.))=1) OR (%sysfunc(weekday(¤t_date.))=3 and %sysfunc(day(¤t_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
相关产品推荐
相关产品推荐

