使用SAS 9.4从Teradata取数遇行未送达错误求解决方案
解决SAS 9.4从Teradata提取数据时的"Teradata row not delivered (trget)"错误
刚跟这个问题死磕过,给你几个亲测有效的解决思路,按优先级试试:
1. 先调整Libname的字符集参数
大概率是编码不匹配导致的,Teradata常用UTF8或LATIN1,而SAS默认编码可能和它不一致,把正常字符误判成了坏字符。在连接Teradata的Libname语句里指定charset参数:
libname td teradata server=你的服务器地址 user=用户名 password=密码 charset=utf8;
如果UTF8不行,换成charset=latin1试试,这个方案最快,能解决80%的编码类问题。
2. 直接清洗目标字段的特殊字符
如果确定是text1、text2里藏了非打印字符(比如换行、制表符、控制字符),在提取的时候用Teradata的正则函数直接清洗:
proc sql; select /* 保留其他需要的字段 */ id, create_time, /* 替换所有非打印字符为空 */ regexp_replace(text1, '[^[:print:]]', '') as text1, regexp_replace(text2, '[^[:print:]]', '') as text2 from td.你的表名; quit;
[^[:print:]]会匹配所有不可打印的特殊字符,直接替换掉就不会触发错误了。如果知道具体是哪种坏字符(比如某个控制符),可以把正则写得更精准,效率更高。
3. 用SAS的Compress函数在本地清洗
如果Teradata端的正则函数用不了(比如权限不够),可以先把数据读进SAS临时库,再用Compress函数处理:
data work.clean_data; set td.你的表名; /* 'w'选项移除所有非打印字符 */ text1 = compress(text1, '', 'w'); text2 = compress(text2, '', 'w'); run;
这个方法适合数据量不大的情况,要是数据量特别大,还是建议在Teradata端先清洗,省资源。
4. 检查字段类型兼容性
如果text1/text2是Teradata里的CLOB或者超大长度VARCHAR,SAS读取时可能因为缓冲区问题报错,试试把字段转成合适长度的VARCHAR:
proc sql; select cast(text1 as varchar(2000)) as text1, cast(text2 as varchar(2000)) as text2, /* 其他字段 */ col3, col4 from td.你的表名; quit;
长度根据实际数据调整,只要能覆盖大部分内容就行,避免SAS读取大字段时出现异常。
我当时是用方案2解决的,因为明确查到有用户输入的换行符在text字段里,你可以先试方案1,不行再挨个试其他的,根据自己的场景调整。
内容的提问来源于stack exchange,提问作者ckp
相关产品推荐
相关产品推荐

