【发布时间】:2016-03-09 16:18:56
【问题描述】:
我的任务是在工作中调试我们的一些旧代码,但遇到了一个问题。代码是用 VB6 编写的,我们有一个名为 RoundIt() 的函数,它接受一个值,然后将其四舍五入到小数点后 2 位。令人惊讶的是,该函数(我在 VB6 方面没有太多经验,所以我假设它可能只是语言的限制)构建了一个 SQL 字符串来执行以对值进行舍入。
所以在代码中我们有一个双精度类型变量,我将其命名为myVal。在这种特殊情况下,我们得到一个错误,因为myVal 的值是0.997721736173984,并且构建的字符串变成了
SELECT ROUND(0.997721736173984, 2) as RoundedNum
这会导致消息“将表达式转换为数字数据类型时出现算术溢出错误”。据我了解,这是由于试图将值四舍五入为 1 但无法这样做,因为现在返回的数据类型与 ROUND 函数中输入的数据类型不同,并且它们必须相同。
我的问题是,因为这是一个动态构建的 SQL 字符串,所以不像我们声明一个具有数据类型的 SQL 变量并在 ROUND 函数中使用它,我们只是构建字符串 - 所以 什么默认情况下0.997721736173984的数据类型到底是什么?那么尝试返回的数据类型是什么?我猜是小数(不确定精度或小数位数),当它尝试返回四舍五入时,精度或小数位数现在不同了价值,但我想确定一下。
我不是要求避免算术溢出,或确定不同服务器上的差异,所以这个问题与建议的内容不重复。我的问题是动态构建的 SQL 字符串输入/输出的数据类型是什么,为什么会导致算术溢出错误(如果根据下面的评论,它们属于相同的数据类型)。
【问题讨论】:
-
你确定是
MS SQL Server?ROUND需要 2 个参数。 -
我的错误,我忘了添加那部分,更新的问题。
-
什么版本的 SQL 服务器?当我将您的代码扔进 SQL 2012 时,它没有运行。也就是说,我的想法是 SQL Server 期望像 numeric(x,y) 这样的东西,并且总位数大于 x。
-
NUMERIC(15,15)Demo -
不要修复查询,修复函数 - 这是浪费且毫无意义的。我 99% 确定 VB6 有 Round() 函数——至少 VBA 有。如果没有,您可以使用基本数学或将值格式化为两位小数,然后将其转换回数字,轻松编写一个。不要在每次需要执行基本数学运算时都进行服务器往返。
标签: sql sql-server double decimal rounding