2013-08-05 2 views
4

SAS 사용하기 DB의 크기가 커서 속도가 빠른 SQL 데이터베이스에서 데이터를 가져옵니다. 아래 코드는 예상대로 작동합니다.sas 변수를 SQL 통과 문으로 전달

%let expectdate1 = '2013-07-03';*/ 

proc sql; 

connect to ***** as abc (tdpid=***** user='****' password='*****'); 
create table Searched_data as 
select * from connection to dss(

SELECT * 
FROM database.tablename 
WHERE CAPTURE_DT >= '2013-07-01' and CAPTURE_DT <= &expectdate1 

); 
disconnect from abc; 
quit; 

expectate1을 매개 변수화하려고 할 때 문제가 발생합니다.

그래서 난

%let expectdate1 = put(Date(),YYMMDD10.); 

이 나던 작업과 임 점점 오류와 함께

%let expectdate1 = '2013-07-03';*/ 

교체는

....WHERE CAPTURE_DT >= '2013-07-01' and CAPTURE_DT <= put(Date(),YYMMDD10) ..... 

같은 그래서 그 내 날짜 코드를 평가하고 대신을하지 않습니다 결과 코드가 아닌 SQL에 실제 코드를 전달합니다.

답변

2

참고 : 필요한 작은 따옴표로 편집하십시오.

먼저 작동하는 해결책을 제공 한 다음 접근 방식이 작동하지 않는 이유를 설명하십시오. 사용하는 대신이 코드 조각 :

data _NULL_; 
    call symput("expectdate1",cats("'",put(Date(),YYMMDD10.)),"'"); 
run; 

당신의 문자열을 만든 다음 expectdate1 매크로 변수에 넣어 것입니다 위의 코드 조각.

코드가 작동하지 않는 이유는 무엇입니까?
SAS 기능과 SAS 매크로 기능을 구별하지 않기 때문입니다. put (Date(), YYMMDD10.)은 매크로 함수가 아닙니다. 백분율 기호로 시작하기 때문에 쉽게 구별 할 수 있습니다. -> % < -)

SAS 매크로는이를 평가하지 않고 코드 조각을 말 그대로 당신의 SQL 문.

이제는 % sysfunc 함수라는 것이 있습니다. 매크로 함수는 닫힌 일반 함수를 수행합니다. % sysfunc (Date())는 expectdate 매크로 변수를 설정하기 전에 SAS 매크로로 해석됩니다. 각 기능은 % sysfunc 함수 묶어야 주, 즉 상기

그게되고
%let someVariable = %sysfunc(mean(max(1,3),5)); /*WRONG*/ 
%let someVariable = %sysfunc(mean(%sysfunc(max(1,3)),5)); /*RIGHT*/ 

, SAS는 일부 기능이 작동하지 않는 넣고 그 중 하나이다.
그 이유는 내가 위에 솔루션을 제공 : 당신이 원하는대로 그것을 준비하고 매크로 변수에 결과를 작성하는 데이터 단계를 사용합니다.

+0

코드는 작동 아직 기록하지 않습니다는 'CAPTURE_DT> = '2013년 8월 5일'와 CAPTURE_DT는 <= 을 expectdate1'없이 결과가 어디 있는지 보여줍니다 – user185955

+0

작은 따옴표의 필요성을 반영하여 답변이 업데이트되었습니다. 왜 해결되지 않는지, 나는 모른다. 여기에 새로운 세션에서 잘 작동합니다. 발생하는 상황을 파악하기 위해 로깅을보다 자세하게 표시하는 데 도움이 될 수 있습니다. (심볼 템플리트 mprintnest mlogic mlogicnest) – mvherweg

+0

원본 게시물과 같은 통과 시나리오에서 테스트 중인지 확인할 수 있습니까? 패스 스루가 아닐 때 작동합니다. – user185955

4

Shoorack은 PUT 문을 % SYSFUNC와 함께 사용할 수 없지만 PUTN을 성공적으로 사용할 수는 있습니다.

다음이 필요합니다.

%LET EXPECTDATE1 = %SYSFUNC(PUTN(%SYSFUNC(DATE()),YYMMDD10.)); 

%put EXPECTDATE1=&EXPECTDATE1.; 

SASLOG :

EXPECTDATE1=2013-08-05 
+0

고마워, 나는 오늘 뭔가를 배웠다. – mvherweg

+1

그것이 내가 SAS에 대해 좋아하는 것입니다. 내가 아무리 많이 생각해도 항상 내가하지 않는 어떤 것이 있습니다. – user2337871

+0

흠 아직도 작동하지 않습니다. 로그에 EXPECTDATE1 = 2013-08-06 이 표시됩니다. 그러나 %를 쓰면 결과가 반환되지 않습니다. expectdate1 = '2013-08-06'; 그럼 잘 동작합니다. – user185955