簡體   English   中英

SAS-在宏中調用proc sql之后的宏

[英]SAS - A Macro following a proc sql called in a macro

這是新內容,因此,如果我做錯了什么,我深表歉意。 我也是SAS的新用戶。

我創建了一個宏,該宏首先調用proc sql,該proc創建一個特定的表,該表我希望將其傳遞給另一個宏(在第一個宏內部)。

%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是libname(Oracle引擎)。

當執行宏Mc_Copy_Table時,以TABLE1作為參數,首先執行Mc_Obsnvars,這將嘗試打開尚不存在的TABLE1。 proc sql之后執行。

為什么宏在proc sql之前執行? 有什么辦法讓proc sql首先執行? proc sql部分放在宏中並不能解決問題。 謝謝 :)

我認為您有語法問題,正如昆汀在他的評論中提到的那樣。 這對我來說行得通:

%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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM