【发布时间】:2021-06-02 14:09:00
【问题描述】:
我有一个宏函数定义如下。
%macro sqlloop(event_id, empl_nbr_var, fleet, base, position);
...lots of code...
%mend;
实际代码将基于更大的表进行引用,但为了排除故障和简单起见,我提供了该表第一行的缩短版本,row1。
| event_id | empl_nbr_var | fleet | base | position |
|---|---|---|---|---|
| 1234 | 111 | 320 | CHS | A |
在输出数据中检查所有类型的字符,除了 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() 的奇怪之处,还是我完全缺少的其他东西?
【问题讨论】:
-
开启
OPTIONS MPRINT并显示宏正在执行的代码。您可能需要在宏内将base和position的分辨率加双引号(即"&base"和"&position",以便代码生成将参数用作字符串值。 -
就是这样。谢谢!!
-
您的手动调用是在参数值中添加单引号。 CALL EXECUTE() 代码没有添加那些引号字符。如果您需要传递给宏的值中的引号,只需将
STRIP()函数调用替换为QUOTE(TRIM())函数即可。