sas - 当 &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
问题是为什么我需要对此进行超量处理才能获得预期的结果,或者我只是做错了什么(再次:))
谢谢
解决方案
在 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)
推荐阅读
- html - 背景图像和身体浮动不起作用
- javascript - 在向节点发送 ajax 请求而不重新加载页面后更新我在 ejs 中的视图
- python - 使用 Python 使用 ADB 列出文件
- c# - 我的 XAML 中有两个自定义控件,如何将其中一个控件绑定到另一个控件?
- eiffel - eiffel: semantic of ANY default
- .net - 如何根据 Service Fabric 中的取消令牌停止 Topshelf 服务?
- java - 一个接一个地执行 Selenium 测试,而无需通过 testng 重新启动浏览器
- c# - ABP 框架 - ValidateModel() 并显示成功消息的最佳方式
- android - Firebase 云消息传递:新登录用户的新令牌
- python - 来自python字符串的C char数组