【问题标题】:How do you pass a SAS dataset as a paramteter in a macro?如何将 SAS 数据集作为宏中的参数传递?
【发布时间】: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; 将数据集的名称放入您用于包含数据集名称的宏变量中。

标签: sas include sas-macro


【解决方案1】:

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

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

【讨论】:

  • 那么,你不是说在我的 %include 语句之前用 %let 将它分配给 D 吗?那么当“P”运行引用“&D.”时,它应该是好的? P 中说 do Proc SQL 的语法是什么?创建表WORK.TEST AS Select * from "&D.";退出; ???
  • 为什么要在数据集名称周围加上引号?在 SAS 代码中,您在字符串文字周围使用引号。
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多