使用 LPAD 和 RPAD 时,Teradata table 创建和 select 语句失败
Teradata table creation and select statements fail when using LPAD and RPAD
背景:我正在处理的应用程序没有使用任何字符定界符。字段是固定长度的。字母数字字段必须左对齐并 space 填充到右侧,数字字段必须右对齐并在左侧填充零。
我一直在尝试使用 RPAD 和 LPAD 功能来完成此操作。我 运行 遇到的问题是 Teradata 显示的错误 "Response Row size or Constant Row size overflow"。每条记录为 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
任何人都可以向我解释为什么这不起作用吗?谢谢
当您检查结果数据类型 (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
和 LPAD
不是内置函数而是 FastPath UDF,因此 parser/optimizer 似乎不知道实际结果大小(否则对于其他 UDF 没问题,例如 LTRIM
/RTRIM
)
背景:我正在处理的应用程序没有使用任何字符定界符。字段是固定长度的。字母数字字段必须左对齐并 space 填充到右侧,数字字段必须右对齐并在左侧填充零。
我一直在尝试使用 RPAD 和 LPAD 功能来完成此操作。我 运行 遇到的问题是 Teradata 显示的错误 "Response Row size or Constant Row size overflow"。每条记录为 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
任何人都可以向我解释为什么这不起作用吗?谢谢
当您检查结果数据类型 (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
和 LPAD
不是内置函数而是 FastPath UDF,因此 parser/optimizer 似乎不知道实际结果大小(否则对于其他 UDF 没问题,例如 LTRIM
/RTRIM
)