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;
将其分解为关键组成部分
- 将初始观察次数计数器设置为 0
- 执行您的查询
- 检查obs数量
- 如果为零,则休眠然后循环回到#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 ;
我正在尝试在 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;
将其分解为关键组成部分
- 将初始观察次数计数器设置为 0
- 执行您的查询
- 检查obs数量
- 如果为零,则休眠然后循环回到#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 ;