仅当存在连接条件时算术溢出错误

时间:2019-01-11 22:31:09

标签: sql-server tsql stored-procedures

将小数转换为varchar时出现一个奇怪的问题。这是最终SELECT的转换格式,该格式在执行时会导致“将数字转换为数据类型varchar的算术溢出错误”。错误:

CONVERT(VARCHAR(9), CONVERT(DECIMAL(9, 4), Distribution.Rate))

数据集中返回的最大值为351.1800。速率列设置为DEC(15,4),但我们所需文件的规格为9,4。

奇怪的是,在分发表上,我们在ID上连接了另一个表,并且该联接表上有一个条件,将结果限制为仅包含主标记的记录(与Rate无关)。

JOIN LaborDistribution ON LaborDistribution.ID = Distribution.LaborDistributionID
    AND LaborDistribution.IsPrimary = 1

当我删除联接表上的IsPrimary条件时,脚本运行正常,没有错误。请注意,如果我将该条件移至WHERE子句,则该错误将持续存在,与包含在JOIN中时一样。

有什么想法为什么条件表联接与该值完全不相关会导致此问题?我们现在通过提高精度来解决它,但是在导致错误的情况下我们要挠头。

2 个答案:

答案 0 :(得分:1)

a_

假设您的值为CONVERT(VARCHAR(9), CONVERT(DECIMAL(9, 4), Distribution.Rate))

将此值转换为varchar时,实际上需要10个字符长的字段(请注意小数点分隔符)

12345.6789

将解决您的问题

答案 1 :(得分:1)

“将数字转换为数据类型varchar的算术溢出错误。” 可能是explicit or implicit数据类型转换的结果。

时,您的语句CONVERT(VARCHAR(9), CONVERT(DECIMAL(9, 4), Distribution.Rate))将导致显式的数据类型转换错误。

Distribution.Rate <= -1000表示负值(符号使用附加字符)或

Distribution.Rate >= 10000表示正值。

您可以尝试通过以下方式找到这些值:

SELECT Distribution.Rate
FROM Distribution
WHERE (Distribution.Rate <= -1000.0) OR (Distribution.Rate >= 10000.0)

隐式转换对用户不可见,在您这种情况下,这种类型的转换可能是在JOIN语句之后收到此错误的原因。 SQL Server根据Data Type Precedence rules进行转换。与nvarchar(varchar)值相比,数字值具有更高的优先级,因此在隐式转换中,nvarchar(varchar)值将转换为数字。