SAS Proc SQL使用substr创建的字符字段后续插入值被截断如何解决
问题原因
SAS PROC SQL 中通过substr(&Start_dt.,1,4)生成新字段时,会默认根据表达式返回结果的长度,将time_range设置为最大长度4的字符型变量。而SAS的字符变量长度在建表时固定,后续插入超过长度限制的内容就会被自动截断。
解决方案
方案1:建表时显式指定time_range的长度(最推荐)
在建表语句中给time_range字段设置足够容纳后续插入内容的长度即可,按需调整长度数值即可,原有4位长度的第一行数据不会受影响,修改后代码如下:
create table summary3 as select substr(&Start_dt.,1,4) as time_range length=20 format=$20. informat=$20., /* 此处length参数可根据实际需要的最大长度调整,示例为支持最长20个字符 */ NFDPs , NFDPExceeds, NblkExceeds, NFDPExceedsLT30s as NFDPExceedsLT30, NReports as Nbr_report , prcnt_FDP_ext , prcnt_blk_ext , prcnt_extLT30 as prcnt_ext_LT30, prcnt_report, monotonic() as id from OAP_exceedances_by_year;
方案2:已建表的情况下先修改字段长度再插入数据
如果表已经创建完成且有存量数据,可先通过proc datasets修改字段长度,再执行插入操作即可避免截断,参考代码如下:
/* 如summary3不在work库,将lib=work替换为对应的库名 */ proc datasets lib=work nolist; modify summary3; length time_range $20; format time_range $20.; informat time_range $20.; run; quit;
内容的提问来源于stack exchange,提问作者Michael Ancel
相关产品推荐
相关产品推荐

