Как передать набор данных SAS в качестве параметра в макрос? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть программа "P", сохраненная вне моего проекта, которую я могу вызвать в любом проекте, используя оператор% include;он выводит таблицу с именем P_OUTPUT. Я хочу иметь возможность передавать таблицу данных D, которую я создал в своем проекте, в «P», и чтобы «P» использовал информацию в DataTable в операторе SQL в «P».

Я не уверен, как передать таблицу данных в качестве параметра в 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 длядоступ к выходу с контролем уровня участника, потому что WORK.D.DATA используется вами в среде ресурсов IOM ROOT COMP ENV.

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 25 октября 2019

Чтобы передать набор данных в макрос, вы можете передать ИМЯ набора данных. Пример:

%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.

...