Вы можете легко использовать шаг данных для генерации макропеременных.Вы также должны сгенерировать макропеременную, которая вызывает все остальные макропеременные.
%let n_per_list=5 ;
data _null_;
length idlist $32000;
length macrolist $1000 ;
retain macrolist;
do i=1 to &n_per_list until (eof);
set id_list end=eof;
idlist=catx(',',idlist,id);
end;
listno+1;
call symputx(cats('paralist',listno),idlist);
macrolist=catx(',',macrolist,cats('&','paralist',listno));
call symputx('paralist',macrolist);
run;
, которая для простого теста 20 значений, разбитых на группы по 5, дает такой результат:
151 %put Paralist=%superq(ParaList);
Paralist=¶list1,¶list2,¶list3,¶list4
152 %put &=Paralist1;
PARALIST1=1,2,3,4,5
153 %put &=Paralist;
PARALIST=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
Или вы можете просто посмотреть на генерацию кода в макросе вместо использования макропеременных.Это не должно иметь никаких ограничений на длину списка, который вы можете создать.Вы можете попытаться выяснить, как открыть набор данных внутри макроса, не генерируя никакого кода SAS, чтобы результат вызова макроса был просто списком значений.Но было бы намного проще сгенерировать исходный код для определения макроса в файл, а затем% включить файл для его определения.
filename code temp;
data _null_;
set id_list end=eof;
file code lrecl=80;
if _n_=1 then put '%macro paralist;' ;
else put ',' @ ;
put id @ ;
if eof then put / '%mend paralist;' ;
run;
Результат для того же тривиального списка значений 20.
163 %include code / source2;
NOTE: %INCLUDE (level 1) file CODE is file /.../#LN00043.
164 +%macro paralist;
165 +1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20
166 +%mend paralist;
NOTE: %INCLUDE (level 1) ending.
167 %put %paralist;
1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17 ,18 ,19 ,20