1

我在 SAS 中使用宏来循环特定库中的数据表。我将元数据信息放在 data null 步骤中,并与 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 宏在调用执行步骤中运行(在一系列数据集上)并且在双引号内的宏变量中解析的双引号将结束调用执行。

4

4 回答 4

6

试试这个:

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

还要修复 set 语句中的 where 选项:

set &indata(where=(code in (&procedures)));
于 2013-08-20T07:22:25.853 回答
2

一步使用 SQL 怎么样?

%macro filter_codes(indata, outdata);
  过程 sql ;
    创建表 &OUTDATA 为
    从 &INDATA 中选择 *
    其中代码(从过程中选择不同的代码);
  辞职 ;
%修补;

那时无需担心报价。

于 2013-08-21T12:36:07.963 回答
1

在 9.3 中,您有第二个参数,使您能够在quote() 函数中使用单引号。

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 导出等)。

于 2016-05-25T14:02:05.853 回答
0

修复引用变量的问题。听起来你正试图使用​​类似的东西

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

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

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

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

put %sysfunc(quote(The procedure list is &procedures));
于 2016-05-25T14:27:15.437 回答