Here's the SQL factorial:
With Fact (Num, Factorial)
As
(
Select 0 as Num, convert(bigint, 1) as Factorial
Union All
Select Num + 1, convert(bigint, Num + 1) * Factorial from Fact
Where Num + 1 <= 20 --Recursion Buster; not really necessary since Fact(21) doesn't fit in a BigInt anyway
)
Select * from Fact