将小数转换为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中时一样。
有什么想法为什么条件表联接与该值完全不相关会导致此问题?我们现在通过提高精度来解决它,但是在导致错误的情况下我们要挠头。
答案 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)值将转换为数字。