SAS - 在宏

时间:2017-05-17 15:50:50

标签: macros sas sas-macro

新来的,所以如果我做错了什么,我道歉。我也是SAS的新用户。

我创建了一个宏,它首先调用一个proc sql,它创建一个我想将它传递给另一个宏的表(在第一个宏内)。

%Macro Mc_Copy_Table (TABLE_NAME);
  proc sql;
    create table &TABLE_NAME as 
    select *
    from OR_IN.&TABLE_NAME;

    connect using OR_OUT;
    execute (truncate table &TABLE_NAME) By OR_OUT;
    disconnect from OR_OUT;
  quit;

  %MC_obsnvars(&TABLE_NAME);

  %put &Nobs;
  %if &Nobs > 100000 %then
    %do; /* use of the sql loader */
    proc append base = OR_OU. &TABLE_NAME (&BULKLOAD_OPTION)
                data = &TABLE_NAME;
    run;
    %end;
  %else
    %do;
    proc append base = OR_OU. &TABLE_NAME (Insertbuff=10000)
                data = &TABLE_NAME;
    run;
    %end;
%Mend Mc_Copy_Table;

Mc_Obsnvars宏使用attrn函数来获取给定数据集中的观察数量(它首先打开数据集)。根据观察的数量,我的程序是否使用sqlloader。 OR_IN和OR_OUT是libnames(oracle引擎)。

当执行宏Mc_Copy_Table时,假设将TABLE1作为参数,首先执行Mc_Obsnvars,尝试打开尚不存在的TABLE1。之后执行proc sql。

为什么在proc sql之前执行宏?并且有没有办法让proc sql先被执行?将proc sql部分放在宏中并不能解决问题。谢谢:))

1 个答案:

答案 0 :(得分:1)

我认为你有一个语法问题,正如昆汀在他的评论中提到的那样。这对我来说没问题:

%macro copy_table(intable, outtable);
proc sql noprint;
create table &outtable as
select * from &intable;

%count_obs(&outtable);
%put NOBS:&nobs;
quit;
%mend;

%macro count_obs(table);
%global nobs;
select count(*) into :nobs trimmed from &table;
%mend;

data test;
do i=1 to 10;
    output;
end;
run;

%copy_table(test,test2);

但请注意,您无需进行计数。 PROC SQL中有一个名为&sqlobs的自动变量,其中包含上次查询返回的记录数。

所以这给了你想要的东西,我想:

%macro copy_table(intable, outtable);
proc sql noprint;
create table &outtable as
select * from &intable
where i < 5;

%let nobs=&sqlobs;
%put NOBS:&nobs;
quit;
%mend;
%copy_table(test,test2);