使用 LPAD 3 次出现 Teradata 9804 响应行大小或常量行大小溢出错误
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')
下面的代码在添加 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')