用宏变量解析多个&符号

时间:2014-07-22 18:38:40

标签: sas sas-macro

此代码适用于在本地(隐藏敏感信息)上运行的SAS EG:

*---- two values: DEV (ALIASDEV) and PROD (ALIASPROD);
%let my_environment = ALIASDEV;
%let ALIASPROD= (hidden_tns_prod);
%let ALIASDEV= (hidden_tns_dev);

libname mylib oracle user=username password='my_password' path="&&my_environment";

但是这段代码没有(使用rsubmit;)

rsubmit;
*---- two values: DEV (ALIASDEV) and PROD (ALIASPROD);
%let my_environment = ALIASDEV;
%let ALIASPROD= (hidden_tns_prod);
%let ALIASDEV= (hidden_tns_dev);

libname mylib oracle user=username password='my_password' path="&&my_environment";
endrsubmit;

这是错误消息:

  

错误:ORACLE连接错误:ORA-12154:TNS:无法解析   连接标识符指定。错误:LIBNAME语句出错。

我要做的是拥有一个宏(my_environment),我可以切换到我的dev和prod数据库之间无缝地工作。

由于

2 个答案:

答案 0 :(得分:4)

我不知道为什么它在当地工作,但是&符号需要第三个才能正确解决。无论何时将宏变量的值存储在另一个宏变量中,都必须使用三个&符号来检索它。

基本用例:

  • 两个&符号允许您将包含其他宏变量的宏变量解析为名称的 part 。 IE,如果您有&val_sept&val_oct,则可以使用&&val_&mon来检索%let mon=sept
  • 三个&符号允许您检索包含为另一个宏变量的的宏变量。因此,如果您有&sept&oct,那么您可以使用&&&mon.从变量&sept中检索%let mon=sept

这是因为多个&符号如何解决; SAS会进行多次传递,直到所有问题都得到解决。

每次传球:

  1. 每对&符号分解为1个&符号,并被放在一边。
  2. 如果剩下一个&符号,它会随着文本作为宏变量解析,并被存储在其中的值替换。
  3. 所以:

    %let x=a;
    %let a=b;
    %let b=c;
    
    %put &&x;
    

    1:&&x - > (&&)(x) - > (&)(x) - > &x 2:&x - >一个

    %put &&&x;
    

    1:&&&x - > (&&)(&x) - > (&)(a) - > &a 2:&a - > B'/ P>

    %put &&&&x;
    

    1:&&&&x - > (&&)(&&) (x) - > (&)(&)(x) - > &&x 2:&&x - > (&&)(x) - > (&)(x) - > &x 2:&x - >一个

    %put &&&&&x;
    

    1:&&&&&x - > (&&)(&&)(&x) - > (&)(&)(a) - > &&a 2:&&a - > (&&)(a) - > (&a) 3:&a - > B'/ P>

    %put &&&&&&x;
    

    1:&&&&&&x - > (&&)(&&)(&&) (x) - > (&)(&)(&)(x) - > &&&x 2:&&&a - > (&&)(&x) - > (&a) 3:&a - > B'/ P>

    四个&符号对我来说是最有趣的,因为添加一个&符号实际上会让你有效地退步。

    有关详细信息,请参阅我在sas MACRO ampersand上的回答。

答案 1 :(得分:2)

您可能需要额外的&在您的路径规范中,以便它解析为“(hidden_​​tns_dev)”而不是“ALIASDEV”,如下所示:path =“&&& my_environment”。