Sas 如何在PROC SQL中使用具有派生值的宏变量

Sas 如何在PROC SQL中使用具有派生值的宏变量,sas,Sas,在这种情况下,我需要为表名分配一个宏变量,该宏变量的值派生自另一个宏变量 但是,宏中生成的代码使用的是派生公式,而不是派生值本身 %macro testing; %let n=2; %let k=&n-1; %let opp=&k; PROC SQL; CREATE TABLE WORK.TABLE_&opp AS SELECT * from WORK.SOURCETABLE; QUIT;

在这种情况下,我需要为表名分配一个宏变量,该宏变量的值派生自另一个宏变量

但是,宏中生成的代码使用的是派生公式,而不是派生值本身

    %macro testing;

    %let n=2;
    %let k=&n-1;
    %let opp=&k;

    PROC SQL;

    CREATE TABLE WORK.TABLE_&opp AS
    SELECT * from WORK.SOURCETABLE;

    QUIT;

    %mend;

    %testing
这导致代码生成时出错

NOTE: Line generated by the macro variable "OPP".
34          WORK.TABLE_2-1
                    _
                    22
                    200
ERROR 22-322: Syntax error, 
但我希望生成的表将命名为WORK.table_1,而不是WORK.table_2-1

那么,我如何强制SAS识别变量opp=1而不是opp=2-1呢


谢谢

尝试使用%eval,如下所示:

 %macro testing;

    %let n=2;
    %let k=&n-1;
    %let opp=%eval(&k);

    PROC SQL;

    CREATE TABLE WORK.TABLE_&opp AS
    SELECT * from WORK.SOURCETABLE;

    QUIT;

    %mend;

    %testing

尝试使用%eval,如下所示:

 %macro testing;

    %let n=2;
    %let k=&n-1;
    %let opp=%eval(&k);

    PROC SQL;

    CREATE TABLE WORK.TABLE_&opp AS
    SELECT * from WORK.SOURCETABLE;

    QUIT;

    %mend;

    %testing

-你可以在这里读到关于%eval的信息-你可以在这里读到关于%eval的信息是的,似乎做到了这一点。需要阅读更多有关宏函数的内容。谢谢宏变量存储为文本字符串,因此SAS不会识别
%let
语句中的任何计算,除非使用宏函数。我不确定为什么有变量k和opp,因为它们取相同的值(除非这纯粹是为了示例目的)。你可以用
%let k=%eval(&n-1)
来得到同样的答案只要注意,如果你不执行整数运算,你需要
SYSEVALF
。是的,似乎可以做到这一点。需要阅读更多有关宏函数的内容。谢谢宏变量存储为文本字符串,因此SAS不会识别
%let
语句中的任何计算,除非使用宏函数。我不确定为什么有变量k和opp,因为它们取相同的值(除非这纯粹是为了示例目的)。您可以放置
%let k=%eval(&n-1)
以获得相同的答案。请注意,如果您不执行整数运算,则需要
SYSEVALF