SAS数据步IF语句无法正确识别宏变量的问题排查
问题根因
- PROC SQL
INTO子句默认给宏变量赋值时会生成前导空格:未加TRIMMED参数的情况下,COUNT(*)返回的0会被赋值为带前导空格的字符串(如' 0'),和字符'0'比对时会判定为不相等 - 判断逻辑冗余且冲突:同时使用数值比对
&CNT3 ^=0和字符比对&CNT3^='0'做AND逻辑,宏变量本质是字符类型,混用两类比对会触发SAS隐式类型转换,导致判断结果不可控 - 语法细节错误:PROC EXPORT语句中
DATA=TABLE1.末尾多写了一个点,属于语法瑕疵
修复方案
- 给PROC SQL的INTO赋值语句增加
TRIMMED参数,去除宏变量的前后空格 - 统一判断逻辑:COUNT(*)返回值为非负整数,直接判断数值是否大于0即可,无需同时做字符/数值两类比对
- 修正不必要的语法错误
修复后代码
%IF %SYSFUNC(exist(TABLE1)) %THEN %DO; PROC SQL; SELECT COUNT(*) INTO :CNT3 TRIMMED FROM TABLE1; QUIT; %END; %ELSE %DO; %LET CNT3=0; %END; %put &cnt3.; %IF %SYSFUNC(exist(TABLE2)) %THEN %DO; PROC SQL; SELECT COUNT(*) INTO :CNT4 TRIMMED FROM TABLE2; QUIT; %END; %ELSE %DO; %LET CNT4=0; %END; %put &cnt4.; %IF &CNT3 >0 %THEN %DO; PROC EXPORT DATA=TABLE1 DBMS=XLSX OUTFILE="data/REPORT1.xlsx" REPLACE; SHEET="TEST1"; RUN; %END; %IF &CNT4 >0 %THEN %DO; PROC EXPORT DATA=&ENV..AUTH_ERRORLOG_&REC_DATE. DBMS=XLSX OUTFILE="data/REPORT1.xlsx" REPLACE; SHEET="TEST2"; RUN; %END; %let EMAIL_SUBJECT = "TEST EMAIL."; FILENAME OUTBOX EMAIL 'TEST@TEST.COM'; DATA _NULL_; IF &CNT3 >0 OR &CNT4>0 THEN DO; FILE OUTBOX TO=('TEST@TEST.COM') SUBJECT= &EMAIL_SUBJECT. ATTACH=("/data/REPORT1.xlsx" CONTENT_TYPE="APPLICATION/XLSX"); END; ELSE DO; FILE OUTBOX TO=('TEST@TEST.COM') SUBJECT= &EMAIL_SUBJECT.; PUT "NO ERRORS FOUND"; END; RUN;
内容的提问来源于stack exchange,提问作者Ajlec12
相关产品推荐
相关产品推荐

