Да.Используйте стандартные объединения для работы с наборами, а не с RBAR (Row By Agonizing Row).т.е. вместо вызова функции для каждой строки, спроектируйте объединение, которое выполняет требуемую операцию над каждой применимой строкой как операцию набора.
Я часто вижу, что разработчики используют «функция работает с каждой строкой», и хотяпохоже, это очевидный способ инкапсулировать логику, она не очень хорошо работает на SQL Server или на большинстве механизмов БД.
В некоторых случаях можно эффективно использовать табличную функцию (MS SQL Server).
(Кстати, вы правы, говоря, что курсоры неэффективны).