SAS - Использование If-then-do в макросе - PullRequest
0 голосов
/ 11 сентября 2018

Я делаю макрос для извлечения таблиц из базы данных, а затем экспортирую некоторые из этих таблиц, используя proc export.Я делаю это с помощью оператора if-then-do, чтобы проверить, равна ли переменная макроса строке, и если это так, то эта таблица экспортируется.Вот мой код:

%MACRO query(x);
  proc sql;
    connect using conn;
    create table &x. as select * from connection to conn
      (select * 
      from db.&x.);
    disconnect from conn;
  quit;

  %if &x. = "AddressCategory" %then 
    %do;
      proc export data = &x. outfile="C:\path\&x..txt" dbms=dlm replace; delimiter="|"; 
      run;
    %end;
%mend query;
%query(AddressCategory);

Это создает набор данных с именем AddressCategory, но экспорт не работает.есть идеи?Спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

затем экспортируйте некоторые из этих таблиц

Внутри макроса вы, вероятно, не хотите проверять предмет для экспорта по имени. Если вы это сделаете, макрос будет содержать большое количество ifs, проверяющих, какой аргумент подходит для экспорта.

У лучшего макроса будет дополнительный параметр export= со значением по умолчанию 0, и вызываемый объект устанавливает его на 1 для экспортируемых наборов данных

%MACRO fetcher (
  remoteLibref=conn, 
  remoteSchema=db, 
  object=, 
  outlib=work, 
  out=&object, 
  export=0, 
  outpath=C:\exports\&remoteSchema,
  outname=&object
);
  proc sql;
    connect using &remoteLibref;
    create table &outlib..&out as select * from connection to &remoteLibref
    ( select * 
      from &remoteSchema..&object
    );
    disconnect from &remoteLibref;
  quit;

  %if &export %then %do;
      proc export 
        dbms=dlm
        data=&outlib..&out. 
        replace outfile="&outpath.\&object..txt"
      ;
        delimiter="|"; 
      run;
  %end;
%mend fetcher;

Вызовите его для различных удаленных объектов, указав явным образом экспортируемые объекты

libname conn sqlserver … connection string … ;

%fetcher(object=AddressCategory, export=1)
%fetcher(object=AddressBook)
%fetcher(object=PreferenceCategory, export=1)
%fetcher(object=PreferenceItems)
%fetcher(object=PreferenceProperties)
%fetcher(object=Payouts, export=1)
%fetcher(object=Payouts, RemoteSchema=DBX, export=1, outname=hidden-payouts)
...