你可以像这样使用 proc sql 来做:
proc sql noprint inobs=1;
select name into :my_val from sashelp.class;
quit;
%put &my_val;
或者您可以像这样使用数据步骤中的call symput:
data _null_;
set sashelp.class(obs=1);
call symput('my_val',name);
run;
为了更灵活,我们使用了一个实用宏,它允许我们从代码中的任何位置检查值。我已对其稍作修改以适应您的要求,但用法如下:
%let my_val = %get_val(iDs=sashelp.class, iField=name);
您也可以在 proc 或 datastep 中间使用它,如下所示:
data _null_;
my_value = "%get_val(iDs=sashelp.class, iField=name)";
run;
甚至:
proc sql noprint;
create table want as
select * from sashelp.class
where name = "%get_val(iDs=sashelp.class, iField=name)"
;
quit;
这里是宏定义:
%macro get_val(iDs=, iField=);
%local dsid pos rc result cnt value;
%let result=;
%let cnt=0;
/*
** ENSURE ALL THE REQUIRED PARAMETERS WERE PASSED IN.
*/
%if "&iDs" ne "" and "&iField" ne "" %then %do;
%let dsid=%sysfunc(open(&iDs,i));
%if &dsid %then %do;
%let pos=%sysfunc(varnum(&dsid,&iField));
%if &pos %then %do;
%let rc=%sysfunc(fetch(&dsid));
%if "%sysfunc(vartype(&dsid,&pos))" = "C" %then %do;
%let value = %qsysfunc(getvarc(&dsid,&pos));
%if "%trim(&value)" ne "" %then %do;
%let value = %qtrim(&value);
%end;
%end;
%else %do;
%let value = %sysfunc(getvarn(&dsid,&pos));
%end;
&value
%end;
%else %do;
%put ERROR: MACRO.GET_VAL.SAS: FIELD &iField NOT FOUND IN DATASET %upcase(&iDs).;
%end;
%end;
%else %do;
%put ERROR: MACRO.GET_VAL.SAS: DATASET %upcase(&iDs) COULD NOT BE OPENED.;
%end;
%let rc=%sysfunc(close(&dsid));
%end;
%else %do;
%put ERROR: MACRO.GET_VAL.SAS: YOU MUST SPECIFY BOTH THE IDS AND IFIELD PARAMETERS TO CALL THIS MACRO.;
%end;
%mend;
上述宏是在here 找到的%ds2list 宏的缩略版。