String 连接宏变量的不一致行为

String 连接宏变量的不一致行为,string,sas,sas-macro,String,Sas,Sas Macro,我试图通过在宏中串联多个变量/分隔符来创建字符串: %macro write_to_string(); %let delim = = ; %let string = %sysfunc(catx(%str( ), &string, \, step start, %nrstr(%superq(delim)),

我试图通过在宏中串联多个变量/分隔符来创建字符串:

%macro write_to_string();
%let delim = = ;
%let string = %sysfunc(catx(%str( ), 
                             &string, \,
                             step start,
                             %nrstr(%superq(delim)),
                             &etls_stepStartTime,
                             |,
                             output table,
                             %nrstr(%superq(delim)),
                             &SYSLAST, 
                             |,
                             transform return code,
                             %nrstr(%superq(delim)),
                             &trans_rc));
%mend;
在几个转换(在sasdi中)结束时调用宏,因此字符串的末尾会一直追加文本

如果将
%nrstr(%superq(delim))
的每个实例替换为其他一些分隔符,
例如,则上述宏的行为与预期相同。但是对于上面的代码,我得到一个
0
,后面是最后一个附加的字符串

我对宏变量和函数非常无知,并且很难理解

  • 为什么分隔符的选择似乎会影响字符串是否正确追加
  • 为什么宏变量有时需要与前面的
    &
    一起引用,有时不需要
非常感谢您的帮助

编辑

上述代码中的输入变量由SAS DI系统自动生成,并在作业中每次转换后重置。这些值看起来像

&etls\u stepStartTime=2017年2月16日17:25:37

&SYSLAST=WORK.MY_TABLE_NAME

&trans\u rc=0

此处
&trans_rc
的值将指示上次运行的转换的错误/警告状态

所以我想要的输出(使用
&delim
变量工作)将是表单的值

step start=163feb2017:17:25:37 | output table=WORK.MY_table|u NAME | transform return code=0

\
分隔。如上所述,除非我将分隔符更改为某个非保留字符常量,否则我得到的只是前一个
0\
的最后一个值(对应于最后一次转换的值)。

不要将%SYSFUNC()用于CAT。。。一系列函数。首先,您不需要它们,因为在宏代码中,您可以将文本放置在您想要的位置。第二,因为这些函数可以处理数值或字符参数。这意味着SAS必须尝试找出宏代码作为参数生成的文本是表示数字还是字符串。这可能就是等号导致零的原因。SAS将等号视为相等测试,因此零表示两侧的值不相等

%let string =&string \ step start &delim &etls_stepStartTime ;
%let string =&string | output table &delim &SYSLAST ;
%let string =&string | transform return code &delim &trans_rc ;

你能为这段代码引用的所有宏变量提供输入值,以及你得到的结果和你想要的结果吗。嘿@Tom。此处的宏变量由SAS DI系统自动生成,并根据在程序中调用它们的时间而变化(系统在每次转换后设置值)。我将发布一个示例。DELIM值是否更改?还是因为你想让它工作,所以你把它变成了一个宏变量?因为您只使用了三次,所以不使用宏变量可能更容易,只需将
=
放在生成的宏变量中所需的位置即可。嘿@Tom。我真的很感激你的回答。它不仅解决了我的问题,还解决了我面临的其他问题。宏对我来说是无止境的困惑,我永远不知道为什么某些东西会工作或不工作。谢谢