SAS:模仿函数返回值的宏(空字符串或宏变量)

时间:2018-11-06 18:44:25

标签: sas sas-macro

我是SAS的新手,也许天真地尝试将构建宏模拟为SAS中的功能。

我有多个从存储过程中启动的宏变量。一些可能具有值,而另一些可能为空。

%let a1 = column_name1;
%let a2 = column_name2;
%let a3 = ;

%let col1 = &a1;
%let col2 = &a2;
%let col3 = &a3;

我想在proc sql中将它们用作:

proc sql;
  create table some_table as
  select 
  &col1 AS column1,
  &col2 AS column2,
  &col3 AS column3
  from some_table;
quit;

但是,这不适用于空变量(&col3)。因此,我试图构建某种包装它的功能。像这样:

%macro macro_return_string(macro_variable);
        %if length(macro_variable) = 1 %then %do; /* if column_name# is not empty, then it len() is always >2 */
            "";
        %end;
        %else %do;
            macro_variable;
        %end;

%mend macro_return_string;

因此它的用法如下:

%let col1 = macro_return_string(&a1); /* return column_name1 */
%let col2 = macro_return_string(&a2); /* return column_name2 */
%let col3 = macro_return_string(&a3); /* return "" */

感谢帮助!

有人问了一个类似的问题here,但我无法从中解决问题。

2 个答案:

答案 0 :(得分:2)

宏的主要问题是它发出的多余分号。如果要创建“函数”样式的宏,则不能发出未屏蔽的分号,因为它会终止您尝试构建的命令。

%macro macro_return_string(macro_variable);
%if 0=length(&macro_variable) %then %do; 
 " "
%end;
%else %do;
  &macro_variable
%end;
%mend macro_return_string;

还确定要添加引号吗?您是否只会使用它来创建字符变量?

%macro macro_return_string(macro_variable,type=num);
%if 0=length(&macro_variable) %then %do; 
 %if &type=num then . else " ";
%end;
%else %do;
  &macro_variable
%end;
%mend macro_return_string;

答案 1 :(得分:1)

Macro与其他脚本或编码语言不同,它不是基于功能的系统。 Macro是具有副作用的文本处理系统,它可能会或可能不会发出供提交系统使用的源代码。

您的宏将在您尝试生成的sql语句中发出一个"";,分号(;)使工作更加混乱。如果您的%if仅包含%then而没有%then do; … %end;

,则在宏中使用分号可能是合适的

当宏参数中没有表达式时,将var(1)“”分配给列的宏应该是:

%macro macro_return_string(macro_variable);
        %if length(&macro_variable) %then %do;/* there is something in the variable passed, resolve it for emittance as source code*/
&macro_variable/* no semi-colon here */
        %end;
        %else %do;/* argument is empty, emit a blank character as the source code for the default expression*/
" "/* no semi-colon here */
        %end;
%mend macro_return_string;