SAS宏循环,直到obs count> 0

时间:2018-11-16 21:02:21

标签: sas sas-macro

我正在尝试自动执行SAS中的预定事件,以便在SAS程序打开时首先运行通过查询以创建本地表。我希望此查询继续循环运行,直到该表的观察计数大于0。我的想法是,我需要等待数据源的确认表已经准备好,然后才能向服务器运行其他代码,该宏将在宏之后执行。每次桌子没有任何观察时,我也希望它睡10分钟。

我的ODBC连接...

proc sql;
connect to odbc(datasrc="SSDM"); 

EXECUTE ( Create Volatile Table DataReady as

(   
    SQL...

)   WITH DATA ON COMMIT PRESERVE ROWS;) by ODBC;

CREATE TABLE DataReady AS SELECT * FROM CONNECTION TO ODBC ( SELECT * FROM DataReady );

DISCONNECT FROM odbc;

quit;

,还包括睡眠功能...

data _null_;
rc=SLEEP(600);
run;

1 个答案:

答案 0 :(得分:1)

将其细分为关键组成部分

  1. 将初始观察数设为0
  2. 执行查询
  3. 检查obs数量
  4. 如果为零,则进入睡眠状态,然后循环回到#2

4需要宏代码(因此,下面的宏包装器LOOPER),2和3是PROC / DATASTEP,而1可能是两者。

%MACRO LOOPER ;
  %LET OBS = 0 ; /* #1 */

  %DO %WHILE (&OBS = 0) ; /* run everything inside this %DO %WHILE loop  whilst 0 obs - #4 */

    /* put your existing SQL code here - #2 */

    proc sql ; select count(1) into :OBS from DataReady ; quit ; /* #3 */

    %IF &OBS = 0 %THEN %LET S = %SYSFUNC(sleep(10,60)) ; /* sleep for 10 minutes if 0 obs */
  %END ;
%MEND ;

%LOOPER ;