单引号值使用sql创建宏变量

时间:2013-08-19 21:41:34

标签: sas sas-macro

我在SAS中使用宏来遍历特定库中的数据表。我将元数据信息放在数据空步骤中,并与where语句和我的宏变量进行比较。

我的SQL步骤如下:

proc sql;
  select quote(trim(code)) into :procedures separated by ', ' from procedures;
quit;

code的某些值包含“45.10”和“G0102”等值,因此无法强制转换为数字。宏包含以下行:

%macro filter_codes(indata, outdata);
  data &outdata;
     set &indata(where = (code in (&procedures)));
  run;
%mend;

但使用“quote”函数双引号时,十进制值会产生问题。

我可以用单引号分隔值吗?

编辑:问题是由于filter_codes宏是在调用执行步骤(在一系列数据集中)运行的事实引起的,并且在双引号内的宏变量中解析的双引号将结束调用execute。

4 个答案:

答案 0 :(得分:6)

试试这个:

proc sql;
  select catt("'", code, "'") into :procedures separated by ', ' from procedures;
quit;

同样修复set语句中的where选项:

set &indata(where=(code in (&procedures)));

答案 1 :(得分:1)

使用SQL一步到位怎么样?

%macro filter_codes(indata, outdata);
  proc sql ;
    create table &OUTDATA as
    select * from &INDATA
    where code in(select distinct code from procedures) ;
  quit ;
%mend;

无需担心引用。

答案 2 :(得分:1)

在9.3中,您有第二个参数,使您可以在quote() function中使用单引号。

proc sql noprint;
select quote(trim(code),"'") into :procedures separated by ', ' from procedures;

然而..不是这个函数的粉丝,因为它用一个空格填充空字符变量(见下文)。

data _null_;
  x=''; /* empty */
  y=quote(x,"'");
  put y=;  /* gives y=' ' */
run;

不幸的是,它是唯一一个内置的'方式(除了proc导出或类似的方式)以获得可靠的引用(例如引用引号)。

答案 3 :(得分:0)

修复引用变量的问题。听起来你正试图使用​​像

这样的东西
call execute("set &indata(where=(code in (&procedures)))") ;

首先,不需要在CALL EXECUTE字符串中使用双引号。将&过程推送到未解析的命令堆栈。

call execute('set &indata(where=(code in (&procedures)))') ;

如果您确实要解析宏变量,请查看使用%sysfunc(quote())。

put %sysfunc(quote(The procedure list is &procedures));