【发布时间】:2019-10-25 21:15:09
【问题描述】:
我有一个程序“P”保存在我的项目之外,我可以在任何项目中使用 %include 语句调用它;它输出一个名为 P_OUTPUT 的表。我希望能够将我在项目中创建的数据表 D 传递给“P”,并让“P”在“P”的 SQL 语句中使用 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。
我该如何解决这个问题?
【问题讨论】:
-
我不明白。要将数据集传递给宏,请将数据集的名称作为参数值传递。然后展开参数(局部宏变量)以使用您希望宏生成的 SAS 代码中的 NAME。您的宏试图生成什么 SAS 代码?数据集的名称需要出现在代码中的什么位置?
-
我已经编辑了代码,搞错了表名
-
为什么要调用 OPEN() 函数?只需使用
%let D=work.D;将数据集的名称放入您用于包含数据集名称的宏变量中。