如何将SAS数据集作为参数传递给宏?

时间:2019-10-24 21:13:49

标签: sas include sas-macro

我有一个保存在项目外部的程序“ P”,可以在任何项目使用中通过%include语句调用该程序;它输出一个称为P_OUTPUT的表。我希望能够将在项目中创建的数据表D传递给“ P”,并让“ P”使用SQL语句中“ P”中的DataTable中的信息。

我不确定如何将数据表作为SAS中的参数传递。我已经在WORK中创建了名为WORK.D的表

%macro 
%let A = %sysfunc(open(work.D));
%include 'X:\P.sas';
%mend

在“ P”中

Proc SQL;
Create table P_OUTPUT AS 
SELECT …
WHERE Column IN (SELECT * FROM &D.)
;
Quit;

我得到了错误: 错误:您无法通过成员级别的控件打开WORK.D.DATA进行输出访问,因为您正在资源环境IOM ROOT COMP ENV中使用WORK.D.DATA。

我该如何解决?

1 个答案:

答案 0 :(得分:0)

要将数据集传递给宏,可以传递数据集的名称。示例:

%macro mymacro(indsname);
  proc print data=&indsname;
  run;
%mend mymacro;
%mymacro(indsname=sashelp.class);

您的错误消息仅表示您已经在某个地方打开了该数据集,因此SAS无法再次打开它。

为什么要调用OPEN()函数?这没有做任何有用的事情,甚至可能是您无法创建数据集的原因。如果要将WORK.D作为宏变量D的值,则只需执行该操作即可。

%let D=work.D;

然后,在以后的代码中扩展D时,它将生成有效的SAS语法。