Если все запросы имеют результирующий набор из одной строки и одного столбца, вы имеете дело со скалярным результатом, который можно поместить в переменную набора данных.
Используемые функции взаимодействия:
dosubl
, выполнить отдельный блок кода SAS во время выполнения STEP . Proc SQL
запрос в этом случае. Функция DOSUBL позволяет немедленное выполнение кода SAS ...
DOSUBL выполняет код в другом исполнительном устройстве SAS ( известный как побочный сеанс )
into <em>:macro-variable</em>
, сохранить результат в макропеременной symget
, получить результат из макросреды
Если вы запрашиваете одну и ту же собственную таблицу SAS снова и снова, вы можете включить:
sasfile
, открывая набор данных в память, поэтому дисковый ввод-вывод происходит только один раз при повторном запросе к таблице
Пример
Запросы, как указано в вопросе, НЕ включают INTO
пункт. Предполагая, что каждый запрос не имеет INTO
И имеет один скалярный результат, предложение INTO
может быть введено в строку запроса через TRANWRD
.
data have;
input;
query = _infile_;
datalines;
select count(*) from sashelp.class where name between 'A' and 'F'
select count(*) from sashelp.class where name between 'F' and 'K'
select count(*) from sashelp.class where name between 'K' and 'O'
select count(*) from sashelp.class where name between 'O' and 'S'
select count(*) from sashelp.class where name between 'S' and 'ZZ'
select count(*) from sashelp.class where name between 'A' and 'K'
select count(*) from sashelp.class where name between 'A' and 'O'
select count(*) from sashelp.class where name between 'A' and 'S'
select count(*) from sashelp.class where name between 'A' and 'ZZ'
;
sasfile sashelp.class open;
data want;
set have;
* tweak 'presumed to be scalar' query;
length into_query $1000; drop into_query;
into_query = tranwrd (query, 'from', 'into :scalar_result from');
rc = dosubl('proc sql noprint; ' || into_query);
query_result = symget('scalar_result');
run;
sasfile sashelp.class close;
ods listing; proc print; run;
have
pro c печать
query_
Obs query rc result
1 select count(*) from sashelp.class where name between 'A' and 'F' 0 4
2 select count(*) from sashelp.class where name between 'F' and 'K' 0 8
3 select count(*) from sashelp.class where name between 'K' and 'O' 0 2
4 select count(*) from sashelp.class where name between 'O' and 'S' 0 3
5 select count(*) from sashelp.class where name between 'S' and 'ZZ' 0 2
6 select count(*) from sashelp.class where name between 'A' and 'K' 0 12
7 select count(*) from sashelp.class where name between 'A' and 'O' 0 14
8 select count(*) from sashelp.class where name between 'A' and 'S' 0 17
9 select count(*) from sashelp.class where name between 'A' and 'ZZ' 0 19