如何掩盖&通过间接引用

时间:2015-11-24 10:56:00

标签: sas

我正在使用以下宏代码从表中生成客户端列表:

%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然后再将它们更换回来的路线!

任何人都可以提供帮助吗?

1 个答案:

答案 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'