Ошибка функции факториала - превышен максимальный уровень вложенности хранимой процедуры, функции, триггера или представления - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь запустить следующую факториальную функцию, но получаю следующую ошибку.
Превышен максимальный уровень вложенности хранимой процедуры, функции, триггера или представления (предел 32).

Возможно ли это исправить?

The binomial formula given that
x = total number of “successes” (pass or fail, heads or tails etc.) -- 0.025
P = probability of a success on an individual trial --Rate  0.000729
n = number of trials   -- Denominator 13725
q= 1 – p –- is as below:

    DECLARE @n float(53), @x float(53), @p decimal(10, 10), @q decimal(10,10)
    DECLARE @p0 decimal(10,10), @p1 decimal(10,10), @p2 decimal(10,10), @n1 float(53), @n2 float(53), @n3 float(53)
    SELECT @n =13725 , @x = 0.025 , @p = 0.000729,@q=1-@p 
    SELECT @x = 0.025
    SELECT @n1 = dbo.factorial(@n) 
    SELECT @n2 = dbo.factorial(@n-@x)
    SELECT @n3 = 1
    SELECT @p1 = ( @n1/(@n2 * @n3))*power(@p, @x)*power(@q,@n-@x)
    select @p1 as 'Probability of 0 people getting lung illness'

---factorial function
    create function dbo.factorial(@num1 float(53))
    returns float(53)
    as
    begin
    declare @factno bigint;
     
    if  (@num1=1)  set @factno=1;
    else 
     
    set @factno= @num1*dbo.factorial(@num1-1);
     return @factno;

    end
    go

1 Ответ

0 голосов
/ 17 декабря 2018

Рекурсивные вычисления - это не то, где сияет SQL Server (или любая другая база данных).Лучшее решение - вынести это из базы данных и рассчитать в вашем приложении.Но если вы абсолютно обязаны сделать это в базе данных, используйте рекурсивный метод вместо рекурсивного, например:

create function dbo.factorial(@num1 float(53))
returns float(53)
as
begin
    declare @factno bigint;

    ;With Nums As
    (
        select ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS RN
        FROM sys.objects
    )
    SELECT @factno = POWER(10.0, SUM(LOG10(RN)))
    FROM Nums
    WHERE RN <= @num1

    return @factno;
end
...