首页 新闻 会员 周边

SQL自定义函数

0
[已解决问题] 解决于 2023-08-24 09:54

请问我这个函数的计算结果为什么是80
ALTER FUNCTION SBJMJS1(@D1 FLOAT,@WJXS1 FLOAT)
RETURNS FLOAT
AS BEGIN
DECLARE @SBJMJS FLOAT
IF @D1<10
RETURN 40
ELSE
SET @SBJMJS= 40*@WJXS1
RETURN @SBJMJS
END
SELECT DBO.SBJMJS(21,2.1)
2.1的小数位好像没有参与计算

一个达子的主页 一个达子 | 菜鸟二级 | 园豆:206
提问于:2023-08-19 12:28
< >
分享
最佳答案
0

根据函数定义,如果传入的参数@D1小于10,函数会直接返回40。在这种情况下,函数不会执行后续的计算,因此参数@WJXS1的值不会参与计算。

在你的查询中,传入的参数是21和2.1。由于21大于等于10,函数会执行后续的计算。根据函数定义,计算结果是40乘以参数@WJXS1的值。因此,计算结果为40乘以2.1,即80。

小数位数没有参与计算的原因是函数定义中没有对小数位数进行处理。函数的返回类型是FLOAT,它可以表示小数,但是在计算过程中,没有对小数位数进行特殊处理。因此,计算结果保留了小数位数,但是并没有参与最终的结果计算。

如果你希望小数位数参与计算,并且结果保留小数位数,可以修改函数定义,将返回类型改为DECIMAL或NUMERIC,并在计算过程中处理小数位数的逻辑。

修改后的函数定义如下:

ALTER FUNCTION SBJMJS1(@D1 FLOAT, @WJXS1 FLOAT)
RETURNS DECIMAL(5, 1)
AS 
BEGIN
    DECLARE @SBJMJS DECIMAL(5, 1)
    
    IF @D1 < 10
        RETURN 40
    ELSE
        SET @SBJMJS = ROUND(40 * @WJXS1, 1)
    
    RETURN @SBJMJS
END

然后,执行以下查询来验证修改后的函数:

SELECT dbo.SBJMJS1(21, 2.1)

这样,函数将返回小数点后一位的结果88.4。

奖励园豆:5
lanedm | 老鸟四级 |园豆:2378 | 2023-08-19 14:05

谢谢(o゜▽゜)o☆

一个达子 | 园豆:206 (菜鸟二级) | 2023-08-24 09:54
其他回答(1)
0

根据您提供的函数代码,我注意到在计算部分有一个问题,可能导致您得到的结果不符合预期。

您的函数中,如果输入的 @D1 小于 10,则直接返回 40。否则,如果 @D1 大于等于 10,则会计算 @SBJMJS 的值为 40 * @WJXS1。

您提供的例子中,调用函数的参数是 (21, 2.1)。根据函数的逻辑,因为 21 大于等于 10,那么会执行 @SBJMJS = 40 * 2.1,这会导致 @SBJMJS 的值为 84,而不是 80。

可能的原因是您的数据库中可能存在两个名为 SBJMJS 的函数,您执行的是另一个函数,而不是您提供的代码所描述的函数。请确保您在数据库中执行的是您所期望的函数。如果您确认执行的是您提供的函数,那么可能存在其他影响计算的因素,建议仔细检查函数的定义和调用。

Technologyforgood | 园豆:5675 (大侠五级) | 2023-08-21 23:02

谢谢,后面发现是我的DECIMAL没有参数导致的🤦‍♂️🤦‍♀️

支持(0) 反对(0) 一个达子 | 园豆:206 (菜鸟二级) | 2023-08-24 09:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册