Sas 使用sql创建宏变量的单引号值
我使用SAS中的宏循环特定库中的数据表。我将元数据信息放在一个data null步骤中,并与where语句和我的宏变量进行比较 我的SQL步骤如下所示:Sas 使用sql创建宏变量的单引号值,sas,sas-macro,Sas,Sas Macro,我使用SAS中的宏循环特定库中的数据表。我将元数据信息放在一个data null步骤中,并与where语句和我的宏变量进行比较 我的SQL步骤如下所示: proc sql; select quote(trim(code)) into :procedures separated by ', ' from procedures; quit; 代码的某些值包含45.10和G0102之类的值,因此不能强制为数字。宏包含以下行: %macro filter_codes(indata, outdata
proc sql;
select quote(trim(code)) into :procedures separated by ', ' from procedures;
quit;
代码的某些值包含45.10和G0102之类的值,因此不能强制为数字。宏包含以下行:
%macro filter_codes(indata, outdata);
data &outdata;
set &indata(where = (code in (&procedures)));
run;
%mend;
但使用quote函数双引号时,十进制值会产生问题
我可以用单引号分隔值吗
编辑:该问题是由于filter_codes宏是在一系列数据集的调用执行步骤中运行的,在双引号内的宏变量中解析的双引号将结束调用执行。尝试以下操作:
proc sql;
select catt("'", code, "'") into :procedures separated by ', ' from procedures;
quit;
还修复set语句中的where选项:
set &indata(where=(code in (&procedures)));
试试这个:
proc sql;
select catt("'", code, "'") into :procedures separated by ', ' from procedures;
quit;
还修复set语句中的where选项:
set &indata(where=(code in (&procedures)));
使用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;
那么就不必担心引用了。使用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;
那么就不必担心引用了。在9.3中,您有第二个参数,可以在引用中使用单引号 然而。。我不喜欢这个函数,因为它用一个空格填充空字符变量,见下文
data _null_;
x=''; /* empty */
y=quote(x,"'");
put y=; /* gives y=' ' */
run;
不幸的是,这是除proc导出或诸如此类的方法之外,唯一一种“内置”的方法来应用可靠的引用,例如引用引号。在9.3中,您有第二个参数,允许您在引用中使用单引号 然而。。我不喜欢这个函数,因为它用一个空格填充空字符变量,见下文
data _null_;
x=''; /* empty */
y=quote(x,"'");
put y=; /* gives y=' ' */
run;
不幸的是,这是唯一一种“内置”的方式,而不是proc导出或类似的方式来应用可靠的引用,例如引用引用引用。修复引用变量的问题。听起来你好像想用
call execute("set &indata(where=(code in (&procedures)))") ;
首先,在调用执行字符串中不需要使用双引号。将&procedures推送到未解析的命令堆栈上
call execute('set &indata(where=(code in (&procedures)))') ;
如果确实要解析宏变量,请查看使用%sysfuncquote
put %sysfunc(quote(The procedure list is &procedures));
修复引用变量的问题。听起来你好像想用
call execute("set &indata(where=(code in (&procedures)))") ;
首先,在调用执行字符串中不需要使用双引号。将&procedures推送到未解析的命令堆栈上
call execute('set &indata(where=(code in (&procedures)))') ;
如果确实要解析宏变量,请查看使用%sysfuncquote
put %sysfunc(quote(The procedure list is &procedures));
代码没有明显的错误,除非值本身包含引号。SAS使用“from”的方式当然没有什么不同,除了宏变量解析,这与您的问题似乎不相关。在我这方面的一个简单测试证明它工作良好,使用sashelp.class的高度。您可以发布一些示例数据来说明这不起作用吗?您是正确的,这导致错误的原因是引用的文本是在数据null步骤中的调用执行命令中解析的。我已经修改了这个问题。你的代码没有明显的错误,除非你的值本身包含引号。SAS使用“from”的方式当然没有什么不同,除了宏变量解析,这与您的问题似乎不相关。在我这方面的一个简单测试证明它工作良好,使用sashelp.class的高度。您可以发布一些示例数据来说明这不起作用吗?您是正确的,这导致错误的原因是引用的文本是在数据null步骤中的调用执行命令中解析的。我已经修改了这个问题。解决方案是相当明显的,尽管没有quote命令那么优雅。我通过将select“| | code | | |”调用到…中,有效地完成了同样的事情。解决方案非常明显,尽管没有quote命令那么优雅。我通过将select“| | code | |”称为。。。。