If you MUST rewrite the data set to update it, this concept macro might help:
%macro Update(master,update,by);
/*This macro will update data in the master data set, preserving indexes*/
%let master=%qupcase(&master);
%let update=%qupcase(&update);
%let memname=%qscan(&master,2,.);
%if &memname= %then %do;
%let libname=WORK;
%let memname=&master;
%end;
%else %do;
%let libname=%qscan(&master,1,.);
%end;
proc sort data=sashelp.VINDEX (where=(libname="&libname" and MEMNAME="&memname"))
out=indexes;
by INDXNAME INDXPOS;
run;
data _null_;
length Indx Names $2000;
retain indx names;
set indexes nobs=nobs end=last;
by INDXNAME;
if nobs=0 then do;
call symputx ('index',' ');
stop;
end;
IF _n_=1 then do;
indx="(INDEX=(";
end;
if first.INDXNAME then do;
Names='';
indx=catx(' ',indx,indxname,'=(');
end;
Names=catx(' ',Names,Name);
if last.INDXNAME then do;
indx=catx(' ',indx,names,')');
end;
if last then do;
call symputx ('index',CATX(' ',indx,'))'));
end;
run;
data &master &Index;
update &master &update;
by &by;
run;
%mend;
/*Make a dataset with an index - we will update this one*/
Data TEST (index=(Name=(Name) Comp=(Age Height)));
set sashelp.class;
run;
/*Make a dataset with the update values*/
data UpDates;
set sashelp.class (obs=2 keep= Name Age Height);
Age=21;
Height=70;
run;
/*Use the update macro to update the dataset and preserve the indexes*/
options mprint;
%Update(work.test,work.updates, Name)
... View more