首页 > 解决方案 > 当 &bob 不在 %marco 中时,为什么 %superq(&bob) 显示变量?

问题描述

我有一个像这样的宏:

%macro processme(uuid=);
  %put &uuid;
%mend;

从另一个生成 uuid 的宏调用:

%macro processLinks (data=);
proc sql;
reset noprint;
select uuid into :uuid1 from &data;
quit;

%local i;
%do i = 1 %to &sqlobs;

%processLink (uuid=uuid&i);

%end;
%mend;

并且这个宏被调用为:

%processLinks(data=x.entities)

x.entities 包含 8 个左右的 uuid,形式为 12345-123123-1234123-2342 等

当它运行时,它只是通过 put 命令中的 uuid8 打印 uuid1

如果我将 put 命令更改为:

%put %superq(&uuid)

然后它按预期打印所有 uuid,即 12345-123123-1234123-2342

问题是为什么我需要对此进行超量处理才能获得预期的结果,或者我只是做错了什么(再次:))

谢谢

标签: sas

解决方案


在 procesLink 宏变量中,uuid 包含 uuid1,实际上不是 uuid 本身,而是将 uuid1 提供给 superq,然后解析为实际的 uuid。你也可以使用 &&& 代替 superq

例子

%macro m(b);
  %put &b;
  %put %superq(&b);
  %put &&&b;
%mend;
%let a=5;
%m(b=a)

输出

a
5
5

但更正确的是call %m(b=&a)


推荐阅读