2013-08-19 83 views
1

我超过在特定库中的数据表使用宏在SAS循环。我将元数据信息放入数据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; 

但十进制数值创建一个问题,当使用“引用”功能的双引号。

我可以用单引号分隔值?

编辑:问题是由于filter_codes宏在调用执行步骤(在数据集的范围内)运行以及双引号内的宏变量中解析的双引号会结束调用执行而引起的。

+0

您的代码没有任何明显错误,除非您的值本身包含引号。当然没有什么事在SAS如何使用''''从“'除了宏变量的分辨率,这似乎并没有从你的问题与此有关的不同。在我身边一个简单的测试证明了它做工精细,使用'从height'' sashelp.class'。你能发布一些示例数据,显示这不起作用吗? – Joe

+0

您是对的,导致错误的原因是引用的文本在数据_null_步骤中的调用执行命令中解析。我修改了这个问题。 – AdamO

回答

6

试试这个:

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

而且修复SET语句的where选项:

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

该解决方案非常明显,尽管不如“引用”命令那么优雅。我通过调用'select''“||来实现​​同样的效果代码|| “'”变成...'。 – AdamO

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; 

然后就不用担心引用了。

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; 

不幸的是它是唯一的“内置”的方式(不是一个进程的出口或类似其它),以获得可靠的报价申请(如引用引号)。

0

修复,你引用变量的问题。听起来像是你试图使用类似

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

首先,有没有必要使用双引号在调用execute字符串。将&过程推入未解析的命令堆栈。

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

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

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