2

在我的 Co-Op 中,我的经理要求我获取我收集的 SAS 输出表,然后执行一个存储过程,该过程将上传和更新任何已更改为在线 KPI(关键绩效指标)excel 表的数据。

显然,我的老板甚至不太清楚如何做到这一点,而且他已经编程了很长时间。

用外行的话来说,这就是我需要做的:

  • 创建收集的 KPI 表(完成)

  • 将表发送到存储过程(我不想在 SAS 9.3 中使用 ProcSQL,因为我会在太多字段中进行硬编码)

  • 将存储过程读入在线数据表(完成)

  • 如果 KPI 已更改,则替换它们(完成)

这是我想出的 ProcSQL: 为保持匿名而给出了模棱两可的名称:

%let id  = 'HorseRaddish';
%let pwd = 'ABC321';


proc sql;
    connect to odbc (dsn='JerrySeinfeld' uid=&id pwd=&pwd);
    execute (spKPIInsertUpdateKPIData '411', '7.2', '8808', 'M', 'NANANA', 'WorkStation', 'Testing1212', '1', '8/3/2013 10:42AM')  by odbc;
   disconnect from odbc;
quit;

run;

上面的代码工作正常,但就像我说的那样,在数百个字段的 KPI 计算中硬编码是很痛苦的。

4

1 回答 1

2

如果是我,并且我可以灵活地这样做,我会重写 SP 以从表中提取参数并上传表,然后调用 SP。那必须更快。

如果不是,您可以相当轻松地编写该 SP 行的脚本。您仍将在 PROC SQL 中运行它,但您不必手动将其写出来。

就像是:

proc sql;
select cats("execute(spKPIInsertUdateKPIData '",var1,"''",var2,"','",var3,<... more ...>,"') by odbc") into :execlist separated by ';';
quit;

这将创建一个宏变量 &execlist,其中包含对 SP 的调用。然后你就做

proc sql;
connect to odbc ... ;
&execlist.
disconnect from odbc;
quit;

这确实有一些长度限制,%include如果你的字符超过~20k,你可能需要做一些不同的事情(要么剪掉它,要么使用 )。

但同样,这可能不是一个很好的方法 - 更好的是加载到表并从该表更新 SP。就像是:

libname sqldb oledb init_string=whatever;
proc sql;
drop table sqldb._tempSP_KPI;
create table sqldb._tempSP_KPI as select * from <dataset containing values>;
connect to oledb (init_string=whatever);
<exec SP that uses the _tempSP_KPI table)>
quit;

quit;
于 2013-09-03T21:38:56.363 回答