一个计算阶乘的存储过程


create procedure sp_calcfactorial @base_num dec, @factorial dec out
as
set nocount on
declare @previous_num dec

if ((@previous_num > 26) and (@@max_precision < 38)) or (@base_num > 32) begin
print 'Computing this factorial would exceed the server''s max numeric precision of %d or the max. procedure nesing level of 32'
return(-1)
end

if (@base_num < 0) begin
print 'Can''t calculate negative factorials'
return(-1)
end

if (@base_num < 2)
-- Factorial of 0 or 1 = 1
set @factorial = 1
else begin
set @previous_num = @base_num - 1
-- Recursive call
exec sp_calcfactorial @previous_num, @factorial out
-- Got an error, return
if (@factorial = -1) return (-1)
set @factorial = @factorial * @base_num
-- Got an error, return
if (@@error <> 0)
return (-1)
end
return (0)


-- Execute
declare @factorial dec
exec sp_calcfactorial 5, @factorial out
select @factorial


0 comments:

Post a Comment