背景:我正在处理的应用程序没有使用任何字符分隔符。字段是固定长度的。字母数字字段必须左对齐,空格填充到右侧,数字字段右对齐,零填充到左侧。
我一直在努力通过使用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
任何人都可以向我解释为什么这不起作用?感谢
答案 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} })