SAS-在宏条件之前指定库

SAS-在宏条件之前指定库,sas,sas-macro,Sas,Sas Macro,我在宏中的条件逻辑和分配库时遇到问题 我的问题: 在分配库之前,我有条件宏逻辑(%IF/%THEN%DO)语句正在执行,该逻辑基于库中是否存在数据集 我仍在学习SAS中的宏,不知道如何确保首先分配我的库 我的程序如下所示: %MACRO MyProg(); SIGNON... RSUBMIT.... LIBNAME TEMP "My.Qualifiers.To.Location" Disp=shr; %IF %SYSFUNC(EXIST(TEMP.FILE))

我在宏中的条件逻辑和分配库时遇到问题

我的问题: 在分配库之前,我有条件宏逻辑(%IF/%THEN%DO)语句正在执行,该逻辑基于库中是否存在数据集

我仍在学习SAS中的宏,不知道如何确保首先分配我的库

我的程序如下所示:

%MACRO MyProg();
    SIGNON...
    RSUBMIT....
    LIBNAME TEMP "My.Qualifiers.To.Location" Disp=shr;


    %IF %SYSFUNC(EXIST(TEMP.FILE)) %THEN %DO;
    ....some datasteps....
    %END;

ENDRSUBMIT;
SIGNOFF;
%MEND;

%MyProg();
我可以从日志中看到
%IF&SYSFUNC(EXIST(TEMP.FILE))%THEN%DO
为false,然后分配库


如何确保始终首先执行Libname语句?

您的问题是,本地宏处理器在将宏语法交给SAS/CONNECT服务器之前正在处理宏语法。因此,当执行
%MyProg()
时,首先会发生什么,其中的所有文本都被视为文本并进行处理-返回以下内容:

SIGNON...
    RSUBMIT....
    LIBNAME TEMP "My.Qualifiers.To.Location" Disp=shr;
    ....maybe some datasteps or not depending on what happened _locally_ with %if ....
    ENDRSUBMIT;
SIGNOFF;
这是正确的行为,通常非常有用。在很多情况下,您可能希望根据本地内容提交不同的RSUBMIT代码块。然而,这不是你想要的

您需要使用宏引用,以防止在您希望宏解析之前解析该宏。我不能100%确定这里的时间,但我认为
%nrbquote
可能是正确的报价函数

但是,您还有一个问题,
%IF
需要位于远程计算机上的宏中。请记住,
RSUBMIT
所做的是提交另一个SAS.EXE(或unix/vax/etc.等效程序)将要处理的代码。因此,如果你想让它在[something]中处理
%,它必须在宏中。所以你真正需要的是:

SIGNON;
RSUBMIT;
%MACRO MyProg();
    LIBNAME TEMP "My.Qualifiers.To.Location" Disp=shr;


    %IF %SYSFUNC(EXIST(TEMP.FILE)) %THEN %DO;
    ....some datasteps....
    %END;

%MEND;


%MyProg();
ENDRSUBMIT;
SIGNOFF;

正如汤姆在评论中所指出的,这并不总是安全的——提交宏可能是危险的,因为它不总是正确解析的,所以请小心地对待这一点,并考虑是否可以用另一种方式来处理,而不是使用宏语言。或

%包括从驻留在SAS/CONNECT服务器上的文件中删除宏。

我不明白。如前所述,libname语句应始终在%DO块中的任何代码之前执行。也许把你的日志发出去。如果您有选项MLOGIC,那么日志消息可能会令人困惑。如果您设置选项MPRINT NOSYMBOLGEN NOMLOGIC,SAS语句的顺序应该是清楚的。@Quentin宏语法总是在任何SAS代码。。。我认为这正是OP的问题所在(再加上RSUBMIT固有的复杂性)。您的建议是将我的sas宏-%MyProg()保存到远程服务器上,然后使用RSUBMIT和%INCLUDE语句,以便sas在连接后进行编译吗?是的。如果方便的话,还可以使用AUTOCALL宏目录。因此,您在服务器上有一个文件
myprog.sas
,您可以将其放入自动调用目录,然后只
rsubmit;%myprog;endrsubmit
rsubmit;%包括//path/to/myprog.sas%myprog;endrsubmit;`。