我将SQL Server 2005中的几个十进制列的值乘以存储过程。 SP已经进行了数十次计算。
问题在于精确度会丢失。它不是计算结果具有计算中涉及的最大精度的精度,而是6个小数点。 我不知道这是否是SQL Server的默认值。没有列有6个小数点。
问题的任意例子:
column1(10,10)* column2(8,8)* column3(8,5)结果为十进制(10,6)。
我需要精度为10而不是6。
我知道我可以将所有列和计算转换为我想要的但是这对于一堆复杂的存储过程来说太过分了。
我可以在SP中强制执行一般默认设置吗?
像'SET DECIMALPRECISION 10'这样的东西? (我做了那个)
修改 这是规模而不是精确度
答案 0 :(得分:4)
不,这是SQL Server如何确定精度:http://msdn.microsoft.com/en-us/library/ms190476.aspx
修改强> 可以肯定的是,您可以使用以下命令确切了解SQL Server用于表达式的精度和比例:
SELECT SQL_VARIANT_PROPERTY( YOUR_EXPRESSION_HERE , 'Precision')
SELECT SQL_VARIANT_PROPERTY( YOUR_EXPRESSION_HERE , 'Scale')
SELECT SQL_VARIANT_PROPERTY( column1(10,10) * column2 (8,8) * column3(8,5) , 'Scale')
我不太确定你的精确度/规模是你的想法...... 试试这个:
declare @one decimal(10,10)
declare @two decimal(8,8)
declare @three decimal(8,5)
set @one=.1234567891
set @two=.12345678
set @three=123.12345
select @one*@two*@three as Value
,SQL_VARIANT_PROPERTY(@one*@two*@three, 'Precision') AS 'Precision'
,SQL_VARIANT_PROPERTY(@one*@two*@three, 'Scale') AS 'Scale'
输出:
Value Precision Scale
--------------------------------------- ----------- -----
1.87659562388635548234810 28 23
(1 row(s) affected)
在我提供的链接上的图表说,比例将是10 + 8 + 5 = 23,这表明它也是23。因此,如果您愿意,可以向下舍入到10。
答案 1 :(得分:0)
为了清楚,你想要精度为10还是比例为10?类型声明的格式为:
DECIMAL(precision, scale)
提供的KM链接显示了每个链接的一些示例。如果你想避免反复编写相同的代码,我会写一个函数来调用,它会提供你反复重复的所有舍入和数学,或者创建一个用户定义的类型为你做(使用T-SQL或通过CLR)。