Cộng đồng wiki trả lời :
Bạn có thể thất vọng với kết quả trong SQL Server so với PostgreSQL (có thể xử lý số lượng rất lớn như 30000! Mà không mất độ chính xác).
Trong SQL Server 33!là cao như bạn có thể đi với độ chính xác chính xác trong khi 170!là cao như bạn có thể đi vào tất cả ( 171!là1.24E309 vượt quá giới hạn của float).
Vì vậy, bạn chỉ có thể tính toán trước chúng và lưu trữ chúng trong một bảng có giá trị 0 ... 170. Điều này phù hợp trên một trang dữ liệu nếu nén được sử dụng.
CREATE TABLE dbo.Factorials
(
N TINYINT PRIMARY KEY WITH (DATA_COMPRESSION = ROW),
FactorialExact NUMERIC(38, 0) NULL,
FactorialApprox FLOAT NOT NULL
);
WITH R(N, FactorialExact, FactorialApprox)
AS (SELECT 0,
CAST(1 AS NUMERIC(38, 0)),
1E0
UNION ALL
SELECT R.N + 1,
CASE WHEN R.N < 33 THEN ( R.N + 1 ) * R.FactorialExact END,
CASE WHEN R.N < 170 THEN ( R.N + 1 ) * R.FactorialApprox END
FROM R
WHERE R.N < 170)
INSERT INTO dbo.Factorials
(N,
FactorialExact,
FactorialApprox)
SELECT N,
FactorialExact,
FactorialApprox
FROM R
OPTION (MAXRECURSION 170);
Ngoài ra, sau đây sẽ cho kết quả chính xác cho @N lên đến 10 - và gần đúng cho 11 + (nó sẽ chính xác hơn nếu các chức năng khác nhau / hằng số ( PI(), EXP(), POWER()) đã làm việc với DECIMALcác loại nhưng họ làm việc với FLOATchỉ):
DECLARE @N integer = 10;
SELECT
CONVERT
(
DECIMAL(38,0),
SQRT(2 * PI() * @N) *
POWER(@N/EXP(1), @N) *
EXP(1.0/12.0/@N + 1.0/360.0/POWER(@N, 3))
);