使用 LPAD 3 次出现 Teradata 98​​04 响应行大小或常量行大小溢出错误

Teradata 9804 Response Row Size or Constant Row size overflow error by using LPAD 3 times

下面的代码在添加 LPAD 函数后出现“9804 响应行大小或常量行大小溢出错误”错误。如果我删除 LPAD 功能,它 运行 没问题。

使用 ODBC ASCII 连接查询可以正常使用 2 LPAD 函数。具有 3 LPAD 功能的抛出错误。

任何人都可以建议如何修复它。

SELECT 
 CAST(TableA.A AS VARCHAR(50)) AS A 
,LPAD(CAST(CAST(TableA.B AS DECIMAL(18,2) FORMAT '-9999999999999999.9(2)' ) AS VARCHAR(20)),20,' ') AS B
,LPAD(CAST(CAST(TableA.C AS DECIMAL(18,2) FORMAT '-9999999999999999.9(2)' ) AS VARCHAR(20)),20,' ') AS C
,CAST(CAST(TableA.D AS INTEGER FORMAT '9999999999') AS VARCHAR(10)) AS D
,CAST(CAST(TableA.E AS INTEGER FORMAT '9999999999') AS VARCHAR(10))  AS E
,CAST(CAST(TableA.F AS INTEGER FORMAT '9999999999') AS VARCHAR(10))  AS F
,CAST(CAST(TableA.G AS INTEGER FORMAT '9999999999') AS VARCHAR(10))  AS G
,CAST(CAST(TableA.H AS INTEGER FORMAT '9999999999') AS VARCHAR(10))  AS H
,LPAD(CAST(CAST(TableA.I AS DECIMAL(18,2) FORMAT '-9999999999999999.9(2)' ) AS VARCHAR(20)),20,' ') AS I
,CAST(CAST(TableA.J AS SMALLINT FORMAT '99999') AS VARCHAR(10)) AS J
,CAST(CAST(TableA.K AS SMALLINT FORMAT '99999') AS VARCHAR(10)) AS K

FROM TableA AS TableA

当您检查 LPAD 的结果数据类型时,它类似于 VarChar(32000)。当你有多个 LPAD 时,这超过了 64k 的最大行长度。

您可以添加另一个类型转换以减少计算的大小:

,CAST(LPAD(CAST(CAST(TableA.B AS DECIMAL(18,2) FORMAT '-9999999999999999.9(2)' ) AS VARCHAR(20)),20,' ') AS VARCHAR(20)) AS B

FORMAT 指定了前导 space,但 CAST 到 VarChar 将其删除。 您可以切换到 Teradata 样式转换,它为 ANSI 转换设置右对齐和左对齐的格式。

Cast(B AS DECIMAL(18,2) Format '-9999999999999999.9(2)' ) ( VARCHAR(20)) -- or better (CHAR(20))

或者您只需切换到 TO_CHAR:

To_Char(b, '09999999999999999.99')