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

如何在宏中将SAS数据集作为参数传递?,sas,include,sas-macro,Sas,Include,Sas Macro,我有一个程序“p”保存在我的项目之外,我可以在任何项目使用中调用该程序,并使用%include语句;它输出一个名为P_OUTPUT的表。我希望能够将我在项目中创建的数据表D传递给“P”,并让“P”在“P”中的SQL语句中使用数据表中的信息 我不知道如何在SAS中将数据表作为参数传递。我在WORK中创建了一个名为WORK.D的表 %macro %let A = %sysfunc(open(work.D)); %include 'X:\P.sas'; %mend 在“p”中 我得到一个错误: 错

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

我不知道如何在SAS中将数据表作为参数传递。我在WORK中创建了一个名为WORK.D的表

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

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


如何解决此问题?

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

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

我不明白。要将数据集传递给宏,需要将数据集的名称作为参数值传递。然后展开参数(本地宏变量)以使用希望宏生成的SAS代码中的名称。宏试图生成什么SAS代码?在代码中数据集的名称需要出现在哪里?我编辑了代码,弄错了表的名称,为什么要调用OPEN()函数?只需使用
%let D=work.D
将数据集的名称放入宏变量中,您使用宏变量来包含数据集的名称。那么,您的意思是在我的%include语句之前使用%let将其分配给D?那么,当“P”运行引用“&D.”的时候,它应该是好的吗?P中的语法是什么,表示doprocsql;从“&D.”中选择*创建表格WORK.TEST;退出为什么要在数据集名称周围加引号?在SAS代码中,在字符串文字周围使用引号。
%let D=work.D;