Использование КУРСОРА обычно медленнее, чем лучшие альтернативные варианты. При этом первое, над чем вам нужно будет поработать, - это заставить работать оператор SELECT. Не думаю, что так получится, как у вас. Если вы используете COUNT, вы собираете данные. Если вы хотите отфильтровать результаты по совокупности, вы не можете сделать это с помощью предложения WHERE. Вместо этого вам нужно будет переместить его в предложение HAVING. Кроме того, поскольку вы выбираете больше, чем совокупное количество, вам необходимо ГРУППИРОВАТЬ ПО CourseID. Чтобы продолжить этот маршрут, у вас будет SELECT, например:
SELECT c.CourseID, COUNT(sc.StudentID) FROM Courses c JOIN StudentCourses sc
ON c.CourseID= sc.CourseID
GROUP BY c.CourseID
HAVING COUNT(sc.StudentID) < 5 OR COUNT(sc.StudentID) > 10;
Не то чтобы это плохая идея ограничивать количество строк, которые вы собираетесь пройти в КУРСОРЕ, но если вы собираетесь проверять количество студентов как часть КУРСОРА, возможно, они ищут вас, чтобы сделать logi c в самом КУРСОРЕ. Вместо этого вы можете просто исключить предложение HAVING и go во всех строках CURSOR.
После того, как вы выпрямите SELECT и вы FETCH из CURSOR, вы захотите вытащить элементы, которые вы SELECT в переменные, которые затем можно использовать для создания сообщений. Следовательно, вы хотите ОБЪЯВИТЬ их раньше, а затем вставить в них значения КУРСОРА. Что-то вроде
FETCH NEXT FROM Students_Cursor INTO @CourseID, @StudentCount;
WHILE @@FETCH_STATUS <> -1
Затем вы можете выполнить условия IF / THEN на @StudentCount и использовать @CourseID в сообщении. Просто убедитесь, что после этого вы снова ВЫБИРАете NEXT FROM в переменные внутри блока BEGIN / END, затем, конечно, ЗАКРЫВАЕТЕ и ОТКЛЮЧАЕТ КУРСОР.