错误:%EVAL函数的参数中的IN运算符缺少操作数

问题描述

我无法理解该错误,因为我可以执行宏,并且可以正常运行,并且在它给我这个错误10分钟后我尝试再次运行它,有时我会执行第五次给我的错误四次正确的结果。 这是我的代码:

%let list = &Control_1. 
            &Control_2. 
            &Control_3.
            &Control_4.
            ;
%macro print_control_2(list) / minoperator ; 
%let Control_2=Control_2;

     %IF  &Control_2. in &list. %THEN %DO;
          proc sql;
          ...
         ;quit;
     %end; 
%mend;

%print_control_2(&list);

解决方法

更好的做法是使用%symexist()检查是否存在宏变量以保持日志整洁。如果有要检查的变量列表,则可以遍历宏变量列表。默认情况下,countw()%scan()会将空格视为定界符。

%let list = Control_1
            Control_2
            Control_3
            Control_4
            ;

%let Control_2 = Control_2;

%macro print_control_2(list);
    %do i = 1 %to %sysfunc(countw(&list.) );
        %let control = %scan(&list.,&i.);

        %if(%symexist(&control.) ) %then %put &control. exists.;

    %end;
%mend;
%print_control_2(&list);

要专门解决您的问题,您需要用%bquote()引用列表,因为它可能包含未解析的宏变量。这可能会破坏IN运算符。

还建议始终将mindelimiterminoperator添加在一起,因为用户可以通过autoexec设置自己的mindelimiter默认值。这样可以确保始终使用您期望的定界符。

%macro print_control_2(list) / minoperator mindelimiter=' '; 
     %IF  &Control_2. in %bquote(&list.) %THEN %DO;

        %put &control_2. exists.;

     %end; 
%mend;

%print_control_2(&list);

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...