如何基于条件输出运行/不运行SAS或SQL代码?

如何基于条件输出运行/不运行SAS或SQL代码?,sas,sas-macro,proc-sql,Sas,Sas Macro,Proc Sql,我有一个带有宏的SAS程序,它将根据输入条件输出不同的变量列表。例如,对于%MACRO(选项1),我得到三个变量,但是对于%MACRO(选项2),我得到四个变量。所有变量的名称都是固定的,但这只是它们是否创建的问题(基于选项) 如何调整宏,以便用户输入的任何选项仍允许宏运行?换句话说,如果某些变量不存在,我如何告诉它忽略它们 幸运的是,我不局限于任何特定的过程,但它可能必须在数据步骤(宏语言)或PROC SQL语句(where子句或其他一些条件语句)中进行。作为一种编程方法,这在一般情况下是可以

我有一个带有宏的SAS程序,它将根据输入条件输出不同的变量列表。例如,对于%MACRO(选项1),我得到三个变量,但是对于%MACRO(选项2),我得到四个变量。所有变量的名称都是固定的,但这只是它们是否创建的问题(基于选项)

如何调整宏,以便用户输入的任何选项仍允许宏运行?换句话说,如果某些变量不存在,我如何告诉它忽略它们


幸运的是,我不局限于任何特定的过程,但它可能必须在数据步骤(宏语言)或PROC SQL语句(where子句或其他一些条件语句)中进行。作为一种编程方法,这在一般情况下是可以回答的

第一条规则:

当代码量较小时,显式使用宏参数。 这意味着,如果您想(比如)对某个对象执行
PROC means
,但变量不同,您可以执行以下操作:

%macro run_means(var=);
  proc means data=sashelp.class;
    var &var.;
  run;
%mend run_means;

%run_means(var=height);
%run_means(var=weight);
等等。不要把一些条件逻辑放在宏中,让它们成为外部逻辑。这包括变量列表;制作完整的变量和参数列表。不要将它们写入宏中。如果它是一个很长的列表,则在主程序中将其作为宏变量,并传递该宏变量。宏本身应该努力接受给定的内容;今天有两组变量,明天可能有三组,或者一组稍微不同的变量。更改传递给宏的内容比更改宏更容易

虽然数据的分离有点不同,但对于习惯于面向对象编程(尤其是模块化方法)的人来说,这个概念会让他们感到舒服

第二条规则:

当宏的实质部分因参数而异时,请将该代码分成多个宏。 在本例中,假设您有两件事要做:运行PROC MEANS或运行PROC FREQ,这取决于它是字符还是数字变量。在这里,我建议不要将所有这些放在一个宏中。这是可能的,但总的来说这是个坏主意。添加到上一个宏中,如果您想为
sashelp.class
执行此操作,我会这样做:

%macro run_freq(var=);
  proc freq data=sashelp.class;
    tables &var.;
  run;
%mend run_freq;

%run_means(var=height);
%run_means(var=weight);
%run_freq (var=sex);

如何创建这些可能是编程的。很大程度上取决于您正在做什么以及如何生成代码;有时在宏的中间,生成的值决定了你所做的两件事中的哪一件。尽管如此,我仍然会将部分作为单独的宏来编写;然后,您可以添加逻辑来调用相应的宏,并使其更清晰。

将宏视为一个黑匣子无法回答此问题。你需要了解宏是如何工作的,如果你还有具体的问题,就发布它们。