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

SAS:模拟函数返回值的宏(空字符串或宏变量),sas,sas-macro,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

我是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 "" */
谢谢你的帮助


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

宏的主要问题是它发出额外的分号。如果要生成“函数”样式的宏,则不能发出无掩码分号,因为它将终止您尝试生成的命令

%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;

宏不像其他脚本或编码语言那样是基于函数的系统。宏是一种具有副作用的文本处理系统,它可能会或不会发出源代码供提交系统使用

您的宏将发出一个
“”就在您试图生成的sql语句中,分号(
)正在破坏工作。如果您的
%if
中只有
%then
而不是
%then do;,则在宏中使用分号可能比较合适结束

当宏参数中没有表达式时,用于将变量(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;