我不知道有任何直接的方法可以做到这一点。当我过去完成它时,我首先附加新行(使用),然后对现有行proc append
进行第二步。对于修改步骤,如果要就地重建表,则需要在单个数据modify
步骤中使用数据步骤与 aset
和语句的组合。modify
这样做的好处是它的 I/O 少得多(如果它是一个大表并且只有一小部分要更新)并且它保留了现有的索引。缺点是它要复杂得多。代码看起来像这样:
**
** REPLACE VALUES IN CPANEL.PW_STAT WITHOUT REBUILDING THE ENTIRE TABLE.
*;
data cpanel.pw_stat;
set redirect_updates;
modify cpanel.pw_stat key=primary;
select(_iorc_);
when(%sysrc(_sok)) do;
* MATCHED TRANSACTION DATASET TO MASTER DATASET. REPLACE THE VALUE;
if date_redirected ne tmp_date_redirected then do;
date_redirected = tmp_date_redirected;
replace;
end;
end;
when(%sysrc(_dsenom)) do;
* NO MATCH. DO NOT ADD OBS OR REPLACE OBS OR DELETE OBS. RESET ERR AND DO NOTHING.;
_error_ = 0;
end;
otherwise do;
put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
put 'Program terminating. DATA step iteration # ' _n_;
put _all_;
stop;
end;
end;
run;
我应该补充一点,如果性能不是问题,那么从头开始重新创建一个表会更好。