SAS宏报错:%EVAL/%IF条件中字符操作数不符合数值要求
解决SAS宏%IF条件中数值操作数报错问题
问题原因
从日志可见,宏变量Y解析后是带大量前导空格的字符串( 9)。这是因为使用CALL SYMPUT将数值型变量转换为宏变量时,SAS默认采用BEST12.格式,会在数值前补空格对齐,导致宏变量存储的是带空格的字符值。而%IF条件中的NOT IN属于数值比较,%EVAL函数无法将带空格的字符解析为有效数值,因此触发报错。
解决方案
以下三种方法均可解决该问题:
方法1:使用CALL SYMPUTX替代CALL SYMPUT
CALL SYMPUTX会自动去除宏变量值的前后空格,无需额外处理:
data a ; y = month(date()) ; CALL SYMPUTX ('y', y); run ;
方法2:用PUT函数指定无空格的格式转换数值
如果必须使用CALL SYMPUT,可以通过PUT函数将数值转为无空格的字符后再赋值:
data a ; y = month(date()) ; CALL SYMPUT ('y', PUT(y, 2.)); run ;
方法3:在宏条件中用%TRIM去除宏变量的空格
直接在%IF条件里对&y.做去空格处理:
%MACRO TEST; %IF %TRIM(&y.) NOT IN (1,4,7,10) %THEN %DO ; PROC SQL ; SELECT INPUT(Legacy_Bnk_Order_Ctrl_Id,4.) INTO: parameter_acc separated by ',' FROM WORK.parameter_acc_table ; RUN ; %END ; %ELSE %DO ; %LET parameter_acc = '0' ; %PUT ¶meter_acc. ; %END ; %MEND TEST;
内容的提问来源于stack exchange,提问作者Eyal Marom
相关产品推荐
相关产品推荐

