【问题标题】:Teradata table creation and select statements fail when using LPAD and RPAD使用 LPAD 和 RPAD 时,Teradata 表创建和选择语句失败
【发布时间】:2016-02-05 02:10:32
【问题描述】:

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

我一直在尝试通过使用 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

谁能向我解释为什么这不起作用?谢谢

【问题讨论】:

    标签: sql padding teradata


    【解决方案1】:

    当您检查生成的数据类型 (SELECT TYPE(RPAD(t1.MemberNbr, 20, ' '))) 时,您会注意到它是 VARCHAR(32000) CHARACTER SET UNICODEVARCHAR(64000) CHARACTER SET LATIN,您需要使用强制类型转换来减少它:

    CAST(RPAD(t1.MemberNbr, 20, ' ') AS CHAR(20))
    

    我知道这很愚蠢,但是 RPADLPAD 不是内置函数而是 FastPath UDF,因此解析器/优化器似乎不知道实际结果大小(否则其他 UDF 可以,例如LTRIM/RTRIM)

    【讨论】:

    • 啊,我不知道字段被更改为VARCHAR(32000)。您的解决方案运行良好,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2012-10-06
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    相关资源
    最近更新 更多