有没有人遇到以下情况,当你在SQL中划分一个数字时,会追加随机数量的尾随零?...
SELECT 8.95/10 ... results in 0.895000
如果您遇到过这种情况,添加零的原因是什么?
更新:我知道将结果转换为FLOAT将删除0的
答案 0 :(得分:1)
首先,在SSMS中查询时看到尾随零或任何内容并不是因为它对数据库引擎来说是特殊的,但它始终是用于显示的内部查询结果格式化的结果。毕竟,所有数字都只是某种表示中的二进制值,在某些时候会被转换为字符串以供显示。
无论如何,真正的原因是因为涉及的数据类型以及SSMS如何决定显示它们。在进行这些计算时,SQL Server必须根据输入的类型决定结果的数据类型,在特定情况下,它是numeric(7,6)
。您可以通过将结果保存到临时表并在其上运行sp_columns
来轻松查看结果类型:
SELECT 8.95 AS dividend,10 AS divider,8.95/10 AS result INTO #temp ;
EXEC tempdb..sp_columns '#temp' ;
SELECT * FROM #temp ;
DROP TABLE #temp ;
在我的情况下,它返回了这个(暂时还有其他无趣的事情):
COLUMN_NAME TYPE_NAME PRECISION LENGTH SCALE
dividend numeric 3 5 2
divided int 10 4 0
result numeric 7 9 6
在分区中的不同位置播放铸件只会更改生成的数据类型。有趣的事实是结果列的Scale
,请注意它是6.这正是SSMS决定为NUMERIC
数据类型显示的小数位数,而不管实际值如何。 FLOAT
没有来自SSMS的这种格式化,这就是为什么转换消除了尾随零的原因。当然,当从SSMS外部使用数据库时,格式化将取决于调用应用程序,并且不受所有这些限制。
作为此行为的另一个示例,只需尝试SELECT CAST(1 AS NUMERIC(18,10))
并看到它显示1.0000000000
。