Наиболее программируемым методом нахождения простых чисел является Решето Эратосфена. Суть его заключается в исключении всех произведений чисел из заданного интервала, все оставшиеся числа - простые.
Данный запрос содержит несколько интересных на мой взгляд приемов, первый курсор открывается в команде присвоения, что не является очевидным использованием курсора. Это делается для получения таблицы со всеми числами меньше заданного. Во втором запросе получаем все возможные произведения чисел из первой таблицы. Ещё один интересный момент в соединении таблицы, чтобы сократить количество операций умножения и соответственно количество строк второй таблицы( учитывая свойство коммуникативности a*b =b*a), исключается подобным образом половина произведений.
declare @a int
declare @tab table(num int)
declare @tab2 table(num int)
declare @max_simple int
set @max_simple =10000
declare cur cursor for
select 2
OPEN cur
FETCH NEXT FROM cur INTO @a
WHILE @@Fetch_STATUS=0
BEGIN
while @a<=@max_simple
begin
insert into @tab
select @a as num
set @a=@a+1
end
FETCH NEXT FROM cur INTO @a
END
CLOSE cur
DEALLOCATE cur
insert into @tab2
select t1.num* t2.num as num
from @tab as t1
left join @tab as t2 on t1.num <=t2.num
where t1.num* t2.num<=@max_simple
select max(t3.num)
from @tab as t3
where t3.num not in (select t4.num from @tab2 as t4)
Кстати, у меня на слабеньком сервере для тестов число 9973 этим запросом нашлось за 1 минуту 50 секунд