SAS 宏循环直到 obs count >0

SAS macro loop until obs count >0

我正在尝试在 SAS 中自动执行计划的事件,以便当 SAS 程序首先打开它时 运行 是一个创建本地 table 的直通查询。我希望此查询使 运行ning 保持循环,直到 table 的观察计数 >0。我的想法是,我需要等待数据源确认 table 已准备就绪,然后我才能 运行 向服务器添加我将在宏之后执行的附加代码。我还希望它在每次 table 未显示任何观察结果时休眠 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
  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 ;