使用LPAD和RPAD时,Teradata表创建和选择语句失败

时间:2016-02-04 17:31:24

标签: sql padding teradata

背景:我正在处理的应用程序没有使用任何字符分隔符。字段是固定长度的。字母数字字段必须左对齐,空格填充到右侧,数字字段右对齐,零填充到左侧。

我一直在努力通过使用RPAD和LPAD函数来实现这一目标。我遇到的问题是Teradata显示的错误,“响应行大小或常量行大小溢出”。每条记录,如果是4000字节,并且(从我读过的内容)Teradata中每条记录的最大大小是64KB,所以我在Teradata允许的最大长度之下。

以下是生成错误的代码的一小部分示例;

SELECT
    RPAD(t1.MemberNbr, 20, ' ') AS MemberNbr
    ,RPAD(t1.LastName, 35, ' ') AS LastName
    ,RPAD(t1.FirstName, 25, ' ') AS FirstName
,CAST(t1.B_Day AS DATE FORMAT 'YYYYMMDD') (char(8)) AS BirthDay
FROM someTable AS t1

任何人都可以向我解释为什么这不起作用?感谢

1 个答案:

答案 0 :(得分:3)

当您检查结果数据类型(>>> unsorted_list = [37,-59,4,0,15,-12,9,0] >>> sorted(unsorted_list) [-59, -12, 0, 0, 4, 9, 15, 37] >>> sorted(unsorted_list,reverse=True) [37, 15, 9, 4, 0, 0, -12, -59] )时,您会发现它是SELECT TYPE(RPAD(t1.MemberNbr, 20, ' '))VARCHAR(32000) CHARACTER SET UNICODE,您需要使用强制转换来减少它:

VARCHAR(64000) CHARACTER SET LATIN

我知道这很愚蠢,但是CAST(RPAD(t1.MemberNbr, 20, ' ') AS CHAR(20)) & RPAD不是内置函数,而是FastPath UDF,因此解析器/优化器似乎不知道实际的结果大小(否则它可以用于其他UDF,例如LPAD / {{1} })