【发布时间】:2014-03-14 07:25:08
【问题描述】:
这里是新的。
我编写了一对宏来搜索我们工作中的一个数据库。这是我如何使用它的一个例子:
%LET SVlist=%str(R_PAR_SV_2012_VER3 R_PAR_SV);
%LET ovlist=%str(R_PAR_OV_2012_VER3 R_PAR_OV);
%LET FILTER=
(DIAGNOS like 'S72%' or diagnos contains ' S72' or
DIAGNOS like 'I21%' or diagnos contains ' I21'
);
%LET OVSELECT=PNR,
PNRQ,
INDATUM,
OP,
DIAGNOS,
HDIA,
alder,
SJUKHUS;
%LET sVSELECT=&OVSELECT,UTDATUM,OPD1;
%macro ovsql(ovlist);
proc sql noprint;
%let n=%sysfunc(countw(&ovlist));
%do i=1 %to &n;
%let val = %scan(&ovlist,&i);
create table work.&val as
select &ovselect,
'SV' as souce
from r_par.&val
where pnrq='0';
%end;
quit;
%mend;
%macro svsql(svlist);
proc sql noprint;
%let n=%sysfunc(countw(&svlist));
%do i=1 %to &n;
%let val = %scan(&svlist,&i);
create table work.&val as
select &svselect,
'SV' as souce
from r_par.&val
where pnrq='0';
%end;
quit;
%mend;
%ovsql(&ovlist);
%svsql(&SVlist);
以上工作正常:
如您所见,我基本上有两个宏来处理 2 种略有不同的数据集。为此,我使用了两个列表:
我想知道是否有一种方法可以合并宏,以便当列表中的集合包含名称中的字母 OV 和 SV 时,您可以调节程序运行“OV 宏”列表中的集合包含字母 SV。这个可以吗?
这是我自己的尝试,我尝试了一些变体,但无法使其工作,以供参考。
options mprint;
%macro PSQL(list);
proc sql ;
%let n=%sysfunc(countw(&list));
%do i=1 %to &n;
%let val = %scan(&list,&i);
%let g=
%substr(&val,7,2);
;
%put(&g);
%if &g=:SV %then %do;
create table work._&val as
select &svselect,
'SV' as souce
from r_par.&val
where pnrq='0';
%end;
%else %if &g=:OV %then %do ;
create table work._&val as
select &ovselect,
'OV' as souce
from r_par.&val
where pnrq='0';
%end;
%end;
quit;
%mend;
%PSQL(R_PAR_SV_2012_VER3 R_PAR_OV_2012_VER3);
我真的很乐意提供任何帮助。当谈到 sas 宏语言时,我有点新手。提前致谢
【问题讨论】:
-
如果你打开
OPTIONS MPRINT;,你会在日志中得到什么?您是否看到任何具体错误?