0

我刚刚写了一个SQL函数如下

Create Function LAeq(@Frequency Decimal(18,2), @Sound Decimal(18,2)) 
 RETURNS DECIMAL(18,2)
 AS
 BEGIN
declare @T1 Decimal (28, 10)
DECLARE @T2 Decimal (28, 10)
DECLARE @T3 Decimal (28, 10)
DECLARE @T4 Decimal (28, 10)
DECLARE @T5 Decimal (28, 10)
DECLARE @T6 Decimal (28, 10)
DECLARE @T7 Decimal (28, 10)

SET @T1 = POWER(12200.0,2) * POWER(@Frequency, 4)
SET @T2 = POWER (@Frequency, 2) + POWER(20.6,2)
SET @T3 = POWER (@Frequency, 2) + POWER(107.7,2)
SET @T4 = POWER (@Frequency, 2) + POWER(737.9,2)
SET @T5 = POWER (@Frequency, 2) + POWER(12200.0,2)
SET @T6 = SQRT(@T3 *@T4) * @T5 * @T2
SET @T7 = @T1/ @T6
SET @T7 = @Sound + (2.0 + (20.0 * LOG10(@T7)))
RETURN @T7
END

如果我传递值 0.8、26,则此函数有效。但是,当我有 20000、80 之类的值时,它会失败。我的函数应该适用于频率,因为最大值为 20K,声音可以小于 100 作为最大值。我尝试将 T1、T7 从十进制 (28,10) 更改为 30、15 或 18,2,但对我没有任何作用。我不想定义数据类型的限制,就像我用相同的公式编写 SQL 语句时一样

Select 26 + (2 + (20 * LOG10((POWER(12200,2) * POWER(0.8, 4))/ (SQRT((POWER (0.8, 2) + POWER(107.7,2)) * (POWER (0.8, 2) + POWER(737.9,2))) * (POWER (0.8, 2) + POWER(12200,2)) * (POWER (0.8, 2) + POWER(20.6,2)))))) 

或者

Select 80 + (2 + (20 * LOG10((POWER(12200,2) * POWER(20000.00, 4))/ (SQRT((POWER (20000.00, 2) + POWER(107.7,2)) * (POWER (20000.00, 2) + POWER(737.9,2))) * (POWER (20000.00, 2) + POWER(12200,2)) * (POWER (20000.00, 2) + POWER(20.6,2))))))

它工作得很好,比我的功能更准确。我可以消除函数中数据类型的需要吗?如果没有怎么能保证最大精度?

谢谢。

4

1 回答 1

1

我会使用float而不是decimal作为输入参数和局部变量的数据类型,这不应该导致合理的输入值溢出。

于 2013-08-30T08:06:24.740 回答