Не уверен, что вы имеете в виду вне цикла?
Первое, что сделает программа, это напечатает значение, которое макропеременная VARNAME имеет ДО того, как шаг _null_ данных начинается в журнал.Обратите внимание, что сначала обрабатывается код макроса, а затем полученный текст интерпретируется как код SAS, который вы хотите запустить.Было бы менее запутанным помещать оператор %put
перед оператором data
.
Ваш шаг данных будет "зацикливаться" на каждом наблюдении в исходном наборе данных.Он будет читать наблюдения из ваших входных данных.Цикл DO заставит его установить макропеременную VARNAME в одно и то же значение сто одиннадцать раз.Затем он вызовет макрос с именем MISSIMP, который будет использовать значение VARNAME (во время выполнения оператора CALL EXECUTE).Это будет повторяться до тех пор, пока инструкция SET не попытается прочитать после конца входного набора данных.Все эти вызовы макросов будут выполняться после завершения текущего шага данных.
Намного проще было бы просто пропустить инструкцию CALL SYMPUT и использовать значение NAME, чтобы сгенерировать код для передачи в CALL EXECUTE.Как это:
data _null_;
set basel.Data_Dictionary;
call execute(cats('%missimp(',NAME,')'));
run;