This runs in about 1.5 seconds to get all primes below 1,000,000CREATE TABLE #Numbers
(
Prime INT NOT NULL,
Number BIGINT PRIMARY KEY CLUSTERED
);
DECLARE @Max INT = 1000000;
WITH n0(p)
AS (
SELECT 1
UNION ALL
SELECT 1
), n1(p)
AS (
SELECT 1
FROM n0 AS a
CROSS JOIN n0 AS b
),n2(p)
AS (
SELECT 1
FROM n1 AS a
CROSS JOIN n1 AS b
),n3(p)
AS (
SELECT 1
FROM n2 AS a
CROSS JOIN n2 AS b
),n4(p)
AS (
SELECT 1
FROM n3 AS a
CROSS JOIN n3 AS b
),n5(p)
AS (
SELECT 1
FROM n4 AS a
CROSS JOIN n4 AS b
)
INSERT #Numbers
(
Prime,
Number
)
SELECT f.Prime,
f.Prime * f.Prime AS Number
FROM (
SELECT TOP (1 + @Max / 30)
30 * ROW_NUMBER() OVER (ORDER BY p)
FROM n5
) AS v(Value)
CROSS APPLY (
VALUES (v.Value - 23),
(v.Value - 19),
(v.Value - 17),
(v.Value - 13),
(v.Value - 11),
(v.Value - 7),
(v.Value - 1),
(v.Value + 1)
) AS f(Prime)
WHERE f.Prime <= @Max;
SELECT Prime
FROM (
VALUES (2),
(3),
(5)
) AS v(Prime)
WHERE Prime <= @Max
UNION ALL
SELECT n.Prime
FROM #Numbers AS n
WHERE NOT EXISTS (
SELECT *
FROM #Numbers AS p
WHERE p.Number <= n.Prime
AND n.Prime % p.Prime = 0
)
DROP TABLE #Numbers;
N 56°04'39.26"
E 12°55'05.63"