2012-04-10 11 views
1

SQL에서 매크로를 사용하는 방법?SAS 매크로 : proc sql에서 매크로 사용

&VarTable이 두 변수를 테이블입니다 :

나는 이런 식으로 뭔가 의미 (모든 일에 대해, 그 선택했다) (예를 들어) LibTable

&VarTable의 각 관찰은이다 테이블의 이름 : Lib.Table

나는 모든 테이블에 대한 작업을 수행 할 :

1) 존재 하는가? 이 존재하는 경우 각 테이블, 변수 &VarField 있습니다

2)이

와 마지막 조건이 정렬합니다.

%macro mSortedTable(vLib,vTab,vVar); 
     %if %sysfunc(exist(&vLib..&vTab)) %then %do; 
      proc sort data = &vLib..&vTab; 
       by &vVar; 
      run; 
      &vLib..&vTab 
     %end; 
     %else %do; "" %end; 
    %mend mSortedTable; 

    proc sql noprint; 
      select %mSortedTable(vLib=Lib,vTab=Table,vVar=&VarField) 
       into: AccumVar separated by " " 
      from &VarTable; 
    quit; 

SQL 및 매크로를 사용하는 방법은 무엇입니까?

+0

첫 번째 질문을 교묘히 회피 :이 코드가 작동하지 않습니다 물론 – gaussblurinc

+0

의 그래서 도서관의 관찰 및 데이터를 포함하는 데이터 세트와 함께 당신이 작업을 수행 할 이름을 설정 각 데이터 세트에? 각 변수 이름을 매크로에 넣으려고합니까? –

+0

예. 내 동료는 고양이와 매크로 생성을 사용하여 이것을 할 수 있다고 말했습니다 : proc sql noprint; ''"으로 구분 된 AccumVar에 고양이를 선택하십시오 (% mSortedTable (', Lib,', Table, ', Lib,', ', VarField,') '). 그러나이 변형은 데이터 저장에서 사용할 수 없습니다. 두 매크로를 사용하여 같은 구조를 사용하기로 결정했다. 먼저 정렬 할 것이고 또 다른 이름은'Lib.Table' – gaussblurinc

답변

2

SQL과 매크로를 사용해야합니까? 간단한 데이터 단계와 call execute은 여기서 필요한 것을 할 것입니다.

다음은 처리 할 테이블 목록이있는 데이터 집합을 가져 와서 테이블이 존재하는지 확인한 다음 그 테이블이 존재하는지 확인하기 위해 & VarField로 정렬하는 예제입니다. 원하는 경우 사용자 정의 변수 세트로 각 테이블을 쉽게 정렬 할 수 있습니다.

테이블이 없으면 경고 메시지가 생성됩니다. 전화가 실행

/* create fake data */ 
data testdat; 
length lib $8 table $32; 
input lib $ table $; 
datalines; 
work test1 
work test2 
work test3 
work doesnotexist 
; 
run; 
/* create 3 data sets */ 
data work.test1 work.test2 work.test3; 
input var1 var2 var3; 
datalines; 
1 34 8 
2 54 5 
12 5 6 
; 
run; 
/* end create data */ 

%let VarTable=work.testdat; 
%let VarField=var2 var3; 


data _null_; 
    set &VarTable; 
    dsname=catx('.',lib,table); 
    if exist(dsname) then do; 
    call execute("proc sort data=" || strip(dsname) || "; by &VarField; run;"); 
    end; 
    else do; 
    put "WARNING: The data set does not exist: " lib= table=; 
    end; 
run; 
+0

흠 .. 간단한 코드를 작성했다. :) 그러나이 코드가 제대로 작동하는지 이해할 수 없다. 나를. 나는 당신의 코드에서 매크로를 사용하는 것에 대해 혼란 스럽다. perl-php-js와 같은 언어에서'eval' 함수와 같은'call execute' 작업을 해주시길 바랍니다. – gaussblurinc

+0

예, perl'eval'과 유사합니다. SAS는 문자열을 구문 분석 한 다음 구문 분석 된 코드를 마치 SAS 세션 인 것처럼 제출합니다. 데이터 단계가 한 줄씩 작동하기 때문에 'call execute'는 if 조건과 일치하는 데이터 행당 한 번 제출됩니다. – cmjohns

1

, 나는 디버그 하드를 찾을합니다 (이 예에서는하지 않은) 데이터 단계의 코드가 "실행"복잡하고 그러나 경우에 좋은 솔루션입니다.

또 다른 방법은 모든 변수를 매크로 변수에 넣은 다음 매크로 do 루프에서 반복하는 것입니다.

(@cmjohns 데이터에 건물)

/* create fake data */ 
data testdat; 
length lib $8 table $32; 
input lib $ table $; 
datalines; 
work test1 
work test2 
work test3 
work doesnotexist 
; 
run; 

/* create 3 data sets */ 
data work.test1 work.test2 work.test3; 
input var1 var2 var3; 
datalines; 
1 34 8 
2 54 5 
12 5 6 
; 
run; 
/* end create data */ 

%let VarTable=work.testdat; 
%let VarField=var2 var3; 

proc sql noprint; 
select count(lib) 
into :cnt 
from &vartable; 

%Let cnt=&cnt; 

select strip(lib), strip(table) 
into :lib1 - :lib&cnt, :table1 - :table&cnt 
from &vartable; 
quit; 

%Macro test; 
%Do i = 1 %to &cnt; 

    %Let lib=&&lib&i; 
    %Let table=&&table&i; 
    %Let dsn=&lib..&table; 

    %if %sysfunc(exist(&dsn)) %then %do; 
    Proc sort data=&dsn; 
    by &varfield; 
    run; 
    %end; 
    %else %do; 
    %put WARNING: The data set does not exist: &dsn; 
    %end; 

%end; 
%Mend; 
%test