如何将 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 语法。
我有一个程序 "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 语法。