我正在使用以下宏代码从表生成客户端列表:
%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&Jones之类的名称,因此我需要使用某种屏蔽功能来获得正确的分辨率。我已经尝试了一些方法,最好的猜测是使用%nrbquote(&& cli&i),但似乎无法解决问题。我想我正在犯语法错误,或者间接宏变量引用可能存在问题。
该代码会运行,但是每次在客户端名称中遇到&时都会发出警告。
我宁愿不要沿着用“ and”替换所有&s然后再次将它们改回来的方法!
有人可以帮忙吗?
一个有用的宏函数是%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'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句