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

How do you pass a SAS dataset as a paramteter in a macro?

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

我不确定如何在 SAS 中将数据 table 作为参数传递。我在名为 WORK.D

的 WORK 中创建了 table
%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 以使用成员级控制进行输出访问,因为 WORK.D.DATA 正在被您在资源环境 IOM ROOT COMP ENV 中使用。

我该如何解决这个问题?

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

%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 语法。