我在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。
答案 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));