Я знаю, что немного опоздал, но стоит отметить, что рекурсивный способ, который опубликовал Мартин, не работает для 0.
Это будет (извините, у меня были проблемы с публикацией кода):
declare @target int=3;
WITH N AS
(SELECT 1 AS i,
1 AS f
UNION ALL
SELECT i+1,
f*(i+1)
FROM N
WHERE i < @target),
N0 AS
(SELECT f FROM N WHERE i=@target UNION SELECT 0)
SELECT MAX(f) FROM N0
И, кстати, более быстрая версия:
declare @target int=5;
WITH N AS
(SELECT 1 AS i,
1 AS f
UNION ALL
SELECT i+1,
f*(i+1)
FROM N
WHERE i < @target),
N0 AS
(SELECT f FROM N WHERE i=@target UNION SELECT f=CASE WHEN @target=0 THEN 0 END)
SELECT f FROM N0
WHERE f>=0
Это намного быстрее, потому что я теряю функцию MAX (), которая, как и топ 1,вызывает DISTINCT сортировку.