使用宏函数的 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;
我有一个定义如下的宏函数。
%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;