SAS PROC SQL内连接字段类型不匹配及语法报错问题求解
问题根因与修正方案
所有报错均为PROC SQL基础语法错误,和源表权限、表结构无关,无需修改源表字段类型,直接在查询内完成类型转换即可,核心错误点如下:
- 类型转换函数用法错误:
INPUT()函数的第二个参数需传入目标类型对应的匹配格式,要将字符型ACCOUNT_NBR转为数值型和B表整数字段匹配时,不能使用$32.这类字符型格式($前缀固定代表字符格式),需使用数值型格式,例如BEST32.。 - 计算字段别名语法错误:SELECT子句中给派生字段起别名时,不能加原表别名前缀(即不能写
A.ACCOUNT_NBR_INT,派生列不属于原表A),直接写字段名即可;也不需要用括号把「字段计算逻辑 + AS 别名」整体包裹。 - 日期常量写法错误:SAS PROC SQL中日期字面量必须使用
'DDMONYYYY'd格式,直接写2022-03-14会被解析为2022减3减14的数值运算结果,完全不符合预期日期值。 - 第二次尝试的语法错误:PROC SQL里的
INTO子句仅用于将查询结果赋值给宏变量,要生成新数据表,直接使用CREATE TABLE 表名 AS SELECT ...语法即可,不需要提前创建空表结构。
正确可运行代码
无需提前创建临时表,单步PROC SQL即可完成需求:
PROC SQL; CREATE TABLE SC_STEP_1 AS SELECT INPUT(A.ACCOUNT_NBR, BEST32.) AS ACCOUNT_NBR_INT, A.OPEN_DT, A.STATUS_CD, A.STATUS_DT FROM ACCOUNT A INNER JOIN ACCOUNT_DETAIL B ON CALCULATED ACCOUNT_NBR_INT = B.ACCOUNT_ID WHERE A.STATUS_DT >= '14MAR2022'd AND A.STATUS_CD = "Z"; QUIT;
简化写法参考:如果不需要保留转换后的账号字段,可直接在JOIN条件内做类型转换,省略派生列步骤:
PROC SQL; CREATE TABLE SC_STEP_1 AS SELECT A.OPEN_DT, A.STATUS_CD, A.STATUS_DT FROM ACCOUNT A INNER JOIN ACCOUNT_DETAIL B ON INPUT(A.ACCOUNT_NBR, BEST32.) = B.ACCOUNT_ID WHERE A.STATUS_DT >= '14MAR2022'd AND A.STATUS_CD = "Z"; QUIT;
补充说明
如果ACCOUNT_NBR字段存在非数字的脏值,INPUT()函数转换时会在日志生成提示,可加?前缀忽略无效值报错,例如写为INPUT(A.ACCOUNT_NBR, ?BEST32.),转换失败的字段会返回空值,不会阻断查询运行。
内容的提问来源于stack exchange,提问作者TylerAriasi
相关产品推荐
相关产品推荐

