Sql函数 - 忽略返回值中的小数位

时间:2015-01-24 18:48:04

标签: sql function

为什么使用SUM函数时sql查询会忽略小数位? iv'e使用CONVERT函数但它没有返回正确的值。

示例:

150.30 * 3 = 450.9

但是在我的函数的结果它返回

150.30 * 3 = 451它在小数点后面。

我怎样才能得到确切的计算结果......?

这是我的sql函数查询

CREATE FUNCTION [dbo].[fnGetSubjectCost](@id INT)
RETURNS DECIMAL 
AS 
-- Returns the stock level for the product.
BEGIN
DECLARE @ret DECIMAL;

SELECT @ret = IIF([Name] = 'Tuition', CONVERT([DECIMAL](9,2),Cost) * CONVERT([DECIMAL](15,2),t1.SubjectUnit), CONVERT([DECIMAL](9,2),Cost))
    FROM [HCCDB].[dbo].[SubjectOfferedFee] AS t0
        INNER JOIN HCCDB.dbo.SubjectsOffered  AS t1
            ON t1.SubjectsOfferedID = t0.SubjectsOfferedID
            WHERE t0.SubjectOfferedFeeID = @id
IF (@ret IS NULL) 
SET @ret = 0;
RETURN CONVERT(DECIMAL(15,2), @ret);
END;

查询工作但它没有返回确切的值。它忽略了小数位。

此功能的目的是添加列公式。

ALTER TABLE HCCDB.dbo.SubjectOfferedFee
ADD FinalCost AS CONVERT(DECIMAL(15,2), dbo.fnGetSubjectCost(CONVERT(INT, [SubjectOfferedFeeID])))

1 个答案:

答案 0 :(得分:2)

问题是@ret的声明。

在SQL Server中,小数的默认比例为0(请参阅documentation)。所以,

declare @ret decimal;

相当于:

declare @ret decimal(18, 0);

要明确精确度和规模,例如:

declare @ret decimal(18, 2);