我是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,但我无法从中解决问题。
答案 0 :(得分:2)
宏的主要问题是它发出的多余分号。如果要创建“函数”样式的宏,则不能发出未屏蔽的分号,因为它会终止您尝试构建的命令。
%macro macro_return_string(macro_variable);
%if 0=length(¯o_variable) %then %do;
" "
%end;
%else %do;
¯o_variable
%end;
%mend macro_return_string;
还确定要添加引号吗?您是否只会使用它来创建字符变量?
%macro macro_return_string(macro_variable,type=num);
%if 0=length(¯o_variable) %then %do;
%if &type=num then . else " ";
%end;
%else %do;
¯o_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(¯o_variable) %then %do;/* there is something in the variable passed, resolve it for emittance as source code*/
¯o_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;