s.demuro Asked: 2019-07-05 07:02:15 +0800 CST2019-07-05 07:02:15 +0800 CST 2019-07-05 07:02:15 +0800 CST 不同精度小数之间的隐式转换 772 我知道当 SQL Server 处理类型之间的隐式转换时,它将最低优先级转换为最高优先级。 但是当我在不同精度的小数之间执行运算时,结果数据类型是什么? sql-server type-conversion 2 个回答 Voted Best Answer Paul White 2019-07-05T07:33:05+08:002019-07-05T07:33:05+08:00 结果的类型由Precision、scale 和 Length (Transact-SQL)中规定的规则确定: 下表定义了当运算结果为小数类型时如何计算结果的精度和小数位数。在以下情况下,结果为十进制: 两个表达式都是十进制的。 一个表达式是小数,另一个是优先级低于小数的数据类型。 操作数表达式表示为表达式 e1,精度为 p1,标度为 s1,表达式 e2,精度为 p2,标度为 s2。任何非小数表达式的精度和小数位数是为表达式的数据类型定义的精度和小数位数。函数 max(a,b) 的含义如下:取“a”或“b”中的较大值。类似地,min(a,b) 表示取“a”或“b”中的较小值。 * 结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,将其减少为 38,并减小相应的小数位数以尽量防止截断结果的整数部分。在某些情况下,例如乘法或除法,不会降低比例因子,以保持小数精度,但可能会引发溢出错误。 在加减运算中,我们需要max(p1 - s1, p2 - s2)存放十进制数的整数部分的地方。如果没有足够的空间来存储它们,即 ,max(p1 - s1, p2 - s2) < min(38, precision) - scale则缩小比例以提供足够的空间用于整体部分。结果比例为MIN(precision, 38) - max(p1 - s1, p2 - s2),因此小数部分可能会被四舍五入以适应结果比例。 查看结果类型的一种方便快捷的方法是使用SQL_VARIANT_PROPERTY: DECLARE @V1 decimal (9, 6) = 123.456789; DECLARE @V2 decimal (7, 2) = 12345.67; SELECT [BaseType] = SQL_VARIANT_PROPERTY(@V1 + @V2, 'BaseType'), [Precision] = SQL_VARIANT_PROPERTY(@V1 + @V2, 'Precision'), [Scale] = SQL_VARIANT_PROPERTY(@V1 + @V2, 'Scale'); 输出: ╔══════════╦═══════════╦═══════╗ ║ BaseType ║ Precision ║ Scale ║ ╠══════════╬═══════════╬═══════╣ ║ decimal ║ 12 ║ 6 ║ ╚══════════╩═══════════╩═══════╝ db<>小提琴演示 SEarle1986 2019-07-05T07:11:38+08:002019-07-05T07:11:38+08:00 这个问题有点含糊,但我相信以下是您所追求的 它的工作方式与数学中的工作方式相同: DECLARE @a DECIMAL (5,2) = 100.02 DECLARE @b DECIMAL (8,3) = 10125.020 SELECT @a SELECT @b SELECT @a + @b 将添加数字 one hundred point zero two 至 ten thousand, one hundred and twenty five point zero two zero 这将导致 ten thousand, two hundred and twenty five point zero four zero 运行上述代码时,SQL Server 输出 10225.040
结果的类型由Precision、scale 和 Length (Transact-SQL)中规定的规则确定:
查看结果类型的一种方便快捷的方法是使用
SQL_VARIANT_PROPERTY
:输出:
db<>小提琴演示
这个问题有点含糊,但我相信以下是您所追求的
它的工作方式与数学中的工作方式相同:
将添加数字
one hundred point zero two
至
ten thousand, one hundred and twenty five point zero two zero
这将导致
ten thousand, two hundred and twenty five point zero four zero
运行上述代码时,SQL Server 输出 10225.040