1

SQLでマクロを使用するには? (すべてのものについて、それが選択されました)

私は次のようなことを意味します:

&VarTable2 つの変数を持つテーブルです: (例)LibTable

の各観測値&VarTableは、テーブルの名前です。Lib.Table

私はすべてのテーブルに対して何かをしたい:

1) 存在しますか?

2) 並べ替え

最後の条件: 各テーブルが存在する場合は、 variable があります&VarField

   %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とマクロでこれを行う方法は?

4

2 に答える 2

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;
于 2012-04-10T20:36:24.247 に答える
1

Call execute は良い解決策ですが、"実行" されるデータ ステップ コードが複雑な場合 (この例にはありません)、デバッグが難しいと思います。

もう 1 つの方法は、すべての変数をマクロ変数に入れてから、マクロ do-loop でそれらをループすることです。

(@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
于 2012-04-12T14:37:21.887 に答える