2017-05-17 6 views
0

Neu hier, also wenn ich etwas falsch gemacht habe, entschuldige ich mich. Ich bin auch ein neuer Benutzer von SAS.SAS - Ein Makro nach einem proc sql namens in einem Makro

Ich habe ein Makro erstellt, das zuerst eine proc sql aufruft, die eine bestimmte Tabelle erstellt, die ich an ein anderes Makro übergeben möchte (innerhalb des ersten Makros).

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

Die Mc_Obsnvars Makro Verwendung der attrn Funktion die Anzahl der Beobachtungen aus dem gegebenen Datensatz (es öffnet den Datensatz zuerst) zu erhalten. Je nach Anzahl der Beobachtungen benutzt mein Programm entweder den sqloader oder nicht. OR_IN und OR_OUT sind Libnamen (Oracle-Engine).

Wenn das Makro Mc_Copy_Table ausgeführt wird, mit zum Beispiel TABLE1 als Argument, wird zuerst Mc_Obsnvars ausgeführt, das versucht, TABLE1 zu öffnen, das noch nicht existiert. Der proc sql wird anschließend ausgeführt.

Warum wird das Makro vor der proc sql ausgeführt? und gibt es eine Möglichkeit, die proc sql zuerst ausgeführt werden? Setzen Sie den proc sql Teil in ein Makro, löst das Problem nicht. Danke :)

+0

Wenn ich Ihre Frage verstanden, Sie Proc Sql erste und Zeit ausführen wollen, dann Anzahl der Beobachtungen berechnen. Wenn das korrekt ist, benötigen Sie keine zwei Makros. Bitte entfernen Sie% Mc_Obsnvars (& TABLE_NAME) und führen Sie Ihren Code aus. –

+1

Gibt es ein Semikolon zum Beenden der Anweisung 'create table' vor dem Makroaufruf? Wenn nicht, wird die% Mc_Obsnvars() ausgeführt, bevor die 'create table' ausgeführt wird. Wo endet Ihr PROC SQL-Schritt? Ist% Mc_Obsnavars() auch ein SAS-Code oder füllt er nur eine Makrovariable? – Quentin

+0

Ich habe den Code bearbeitet, um es klarer zu machen. Danke für deine Antworten. – Spoutnik

Antwort

1

Ich denke, Sie haben ein Syntaxproblem, wie Quentin in seinem Kommentar anspielt. Das funktioniert OK für mich:

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

Beachten Sie jedoch, Sie müssen nicht zählen. Es gibt eine automatische Variable von PROC SQL namens &sqlobs mit der Anzahl der Datensätze, die von der letzten Abfrage zurückgegeben wurden.

Also das gibt Ihnen, was Sie suchen, denke ich:

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

Danke und Danke für den '& sqlobs' Trick. Ich habe meine Frage bearbeitet (und den Code ersetzt). Es gibt keinen Fehler, außer dass das Protokoll mir sagt, dass die Work.TABLE1 (die Tabelle, die ich erstelle) nicht existiert (da sie das Macro '% Mc_Obsnvars (& TABLE_NAME)' ausführt, bevor sie 'proc sql' ausführt). Hier habe ich den Makroaufruf außerhalb der 'proc sql', also nach der quit-Anweisung. Übrigens, gibt es einen Unterschied, den Makroaufruf innerhalb oder außerhalb der 'proc sql' zu haben? – Spoutnik

+0

Ich habe versucht, '% let Nobs = & sqlobs;' außerhalb zu verwenden, aber auch innerhalb der 'proc sql' gibt es mir immer 0 (dasselbe, wenn ich das Makro'% MC_obsnvars (& TABLE_NAME); ') verwende. Sehr merkwürdig. Ich habe bemerkt, dass, wenn ich den Code erneut übergebe, der 'proc append', der sqloader verwendet, ausgeführt wird (da die Arbeitstabelle jetzt existiert, aber es ist keine Lösung). – Spoutnik

+0

Wenn Sie immer noch damit zu kämpfen haben, setzen Sie 'Optionen Hinweise mprint mlogic symbolgen;', führen Sie den Code, und fügen Sie den relevanten Log-Teil in die Frage. – DomPazz