尋求 SQL Server 計算素數最高效方法。作者嘗試兩種方案:
MAXRECURSION 32767,無法產生大量素數。SET NOCOUNT ON;
DECLARE @prime TABLE (prime INT NOT NULL PRIMARY KEY);
DECLARE @number INT = 13, @pc INT = 1;
WHILE @pc < 1000000
BEGIN
IF NOT EXISTS (SELECT 1 FROM @prime WHERE @number % prime = 0 AND prime < SQRT(@number))
BEGIN
INSERT INTO @prime SELECT @number;
SET @pc = @pc + 1;
END
SET @number = @number +
CASE
WHEN @number % 2 = 1 THEN 2
WHEN @number % 3 = 2 THEN 2
WHEN @number % 5 = 4 THEN 2
WHEN @number % 7 = 6 THEN 2
WHEN @number % 11 = 10 THEN 2
ELSE 1
END;
END
SELECT @pc;
WITH seq AS (
SELECT 13 AS number
UNION ALL
SELECT s.number +
CASE
WHEN s.number % 2 = 1 THEN 2
WHEN s.number % 3 = 2 THEN 2
WHEN s.number % 5 = 4 THEN 2
WHEN s.number % 7 = 6 THEN 2
WHEN s.number % 11 = 10 THEN 2
ELSE 1
END
FROM seq s
WHERE number < 32767
),
prime AS (
SELECT s.number
FROM seq s
WHERE NOT EXISTS (
SELECT 1 FROM seq s2
WHERE s2.number < s.number AND s.number % s2.number = 0
)
)
SELECT * FROM prime
OPTION (MAXRECURSION 32767);
NOT EXISTS (SELECT ... FROM @prime) 對每個候選數掃描整個素數表,複雜度 O(N²)。MAXRECURSION,不適合大量產生。BULK INSERT 或 Table-Valued Parameters 減少往返。