2016-11-03 1 views
0

내가 절 아래와 같은 곳에서 문자 변수에 액세스하려면 액세스 할 수 없습니다 ->문자 변수가

%macro obs(indsn=, outdsn=, clause=, col=, optr=, subset_val=); 

data &outdsn; 
    set &indsn; 
    &clause &col &optr &subset_val; 
run; 

proc print data= &outdsn;run; 

%mend obs; 

%obs(indsn=infos, outdsn=ch,clause=where,col=name,optr=?, subset_val=Namo); 

어디 절에 연산자 "같이 포함되어있는"하지만 통합하기 위해 노력하고 그것의 작동하지 않는 구문을 제공합니다 오류 ...하지만 누락 된 eq ne le gt 연산자가 작동 중입니다 ... 이 문제를 어떻게 해결할 수 있습니까?

%obs(indsn=infos, outdsn=ch,clause=where,col=name,optr=?, subset_val='Namo'); 
+0

에게 마스크해야 할 수 있습니다 통해 문제가 구문 분석 데 정말 복잡한 필터로 끝날 경우 : 혼자 설 수 WHERE 다음과 같이 내가 수정을 제안 할 것이라는 사실을 사용하여 오버플로 스택을 환영합니다! 수신중인 정확한 구문 오류에 대한 예제 (로그에서)를 게시 할 수 있다면 질문에 대답하는 것이 더 쉬워 질 것입니다. –

답변

0

것은 예 문자열이 필요합니다 (인용) 리터럴을 통과해야합니다.

%macro obs(indsn=, outdsn=, filter=); 

data &outdsn; 
    set &indsn;; 
    Where &filter; 
run; 

proc print data= &outdsn;run; 

%mend obs; 

%obs(indsn=infos, outdsn=ch, filter=name ? 'Namo'); 

을 당신이 필터 문자열

+0

코드가 꽤 일반적입니다. 어떤 경우에는 따옴표 (예 : 숫자 변수)를 사용하지 않거나 따옴표를 섞을 수 있습니다 (예 :'variable in ("do not", 'do not')). 데이터 이스케이프에 따옴표를 넣을 수 있다고 생각하지 않습니다. –

1

을 당신은 너무 많은 자동화를 목표로 할 수있다 : 다음과 같이

+1

나는 다른 조건을 전달하기 위해 여러 매개 변수를 사용하는 대신 하나의 매개 변수로 where 절에 대한 식을 전달하는 것을 좋아합니다. 나는 또한 SAS 키워드 인 매개 변수 이름을 좋아하므로'% obs (data = infos, out = ch, where = name? 'Namo')'로 매개 변수화합니다. – Quentin