我正在使用以下宏代码从表中生成客户端列表:
%macro listclient;
proc sql noprint;
select unique(client)
into :cli1 -
from books; quit;
%put Total Number of Clients: &sqlobs..;
%do i=1 %to &sqlobs;
%put Client &i &&cli&i;
%end;
%mend listclient;
%listclient
我的问题是,有些客户的名字如Smith&琼斯,所以我需要使用某种掩蔽函数来获得正确的分辨率。我尝试了一些事情,我最好的猜测是使用%nrbquote(&& cli& i),但似乎无法解决问题。我想我的语法错误,或间接宏变量引用可能存在问题。
代码运行但每次发出警告时都会发出警告在客户名称中遇到。
我宁愿不用“和”替换所有& s然后再将它们更换回来的路线!
任何人都可以提供帮助吗?
答案 0 :(得分:4)
有用的宏函数是%SUPERQ()
。您只需要为其提供要引用的宏变量的名称(而不是值)。
%do i=1 %to &sqlobs;
%put Client &i %superq(cli&i);
%end;
您还可以将宏变量构建为已经格式化为带引号的字符串。如果使用单引号,那么内部的宏触发器将被忽略。
proc sql noprint;
select distinct cats("'",tranwrd(name,"'","''"),"'")
into :name1 -
from sashelp.class
;
quit;
%put &=NAME1;
NAME1='Alfred'