SAS:模拟函数返回值的宏(空字符串或宏变量)
我是SAS新手,可能天真地试图模仿在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
%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(¯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;
宏不像其他脚本或编码语言那样是基于函数的系统。宏是一种具有副作用的文本处理系统,它可能会或不会发出源代码供提交系统使用 您的宏将发出一个
“”代码>就在您试图生成的sql语句中,分号(;
)正在破坏工作。如果您的%if
中只有%then
而不是%then do;,则在宏中使用分号可能比较合适结束代码>
当宏参数中没有表达式时,用于将变量(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;