使用宏函数的 SAS 类型问题

SAS type issue using a macro function

我有一个定义如下的宏函数。

%macro sqlloop(event_id, empl_nbr_var, fleet, base, position);
...lots of code...
%mend;

实际代码将基于更大的 table 进行引用,但为了故障排除和简单起见,我只使用了此 table、row1 的第一行的缩短版本。

event_id empl_nbr_var 舰队 基地 位置
1234 111 320 CHS 一个

在输出数据中检查除 event_id 以外所有类型的字符,它是数字。这正是我想要的程序。当我手动输入这个时,它工作得很好。

%sqlloop(1234, '111', '320', 'CHS', 'A');

但是下面的代码会抛出各种错误,我认为这是类型问题。

data _null_;
    set Work.row1;
    call execute('%sqlloop(17,'||strip(empl_nbr_var)||','||strip(fleet)||','||strip(base)||','||strip(position)||');');
run;

暂时忽略第 17 部分,假设这是正确的

我遇到的第一个错误如下,所有其他错误似乎都源于 table 未创建。

ERROR: The following columns were not found in the contributing tables: A, CHS.

请注意,A 或 CHS 周围没有引号,我认为应该有?对 SAS 还是新手,所以不是很熟悉,但对我来说,这似乎是错误。这是 strip() 有什么奇怪的地方,还是我完全缺少的其他地方?

对于宏处理器来说,一切都是文本。因此,在您的手动调用中,您在宏参数的值中包含了引号。而在 CALL EXECUTE() 语句中你没有。

您可以重新编写宏以不需要在值中使用引号。例如,将 &fleet. 等引用替换为 "&fleet."

或者在生成宏调用时加上引号。

data _null_;
  set work.row1;
  call execute(cats('%sqlloop(17,',quote(trim((empl_nbr_var))
                   ,',',quote(trim(fleet))
                   ,',',quote(trim(base))
                   ,',',quote(trim(position))
                   ,');'
  ));
run;