使用Teradata WITH子句SQL透传创建SAS数据集报错解决方法
报错原因
代码触发语法错误是3处写法问题导致:
- CTE(WITH语句定义的临时结果集)仅在定义多个时才需要用逗号分隔,你只定义了1个CTE,CTE定义的闭合括号后多余的逗号直接触发了Teradata的语法校验,也就是报错提示的逗号后缺少标识符的问题
- 你给CTE命名为
table,属于SQL通用保留关键字,直接使用会触发标识符解析异常 - 最后查询的对象写错了:WITH定义的CTE仅在Teradata透传的括号内部生效,你写的
from Data是外层SAS要输出的数据集名,在Teradata侧不存在这个对象,应该查询你定义的CTE本身。
修正后可直接运行的代码
Proc sql; connect to teradata(%login); create table Data as select * from connection to teradata ( with tmp_tb as ( select id, amount from TeradataTable ) select distinct id from tmp_tb ); Quit;
补充说明
- SAS的Teradata透传模式下,
connection to teradata()括号内的所有SQL完全遵循Teradata原生语法规则,和外层SAS SQL语法无关,写法要符合Teradata的要求 - 日常写SQL尽量避开用
table、date、select这类保留字作为表、CTE、字段的别名,减少不必要的语法报错 - 如果需要定义多个CTE,参考如下Teradata原生写法:
with cte1 as ( select id from source_table1 ), cte2 as ( select id, amt from source_table2 ) select a.id, b.amt from cte1 a left join cte2 b on a.id = b.id
内容的提问来源于stack exchange,提问作者ckp
相关产品推荐
相关产品推荐

