0

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

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

实际代码将基于一个更大的表进行引用,但为了故障排除和简单性,我有一个该表第一行的缩短版本,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 部分,假设那是正确的

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

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

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

4

1 回答 1

1

对于宏处理器来说,一切都是文本。因此,在您的手动调用中,您在宏参数的值中包含了引号。而在 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;
于 2021-06-02T15:06:27.643 回答