Нет однозначного ответа, так как он действительно зависит от ситуации.
В общем, я думаю, что лучше всего сохранять логику внутри sproc как можно более простой и основанной на множествах. Например, слишком сложная задача с несколькими вложенными условиями IF может усложнить его для оптимизатора запросов, что означает, что он не может создать хороший план выполнения, подходящий для всех путей через sproc. Например, при первом запуске sproc он проходит путь A через логику, и план выполнения отражает это. В следующий раз, когда он запускается с другими параметрами, он проходит по пути B, но повторно использует исходный план выполнения, который не является оптимальным для этого второго пути. Одним из решений этой проблемы является разделение нагрузки на отдельные хранимые процедуры для вызова в зависимости от используемого пути - это позволяет оптимизировать этот подпроцесс и кэшировать план выполнения независимо.
Циклы могут быть единственным жизнеспособным вариантом, но в целом я бы старался их не использовать - всегда старайтесь делать вещи на основе множеств, если это возможно.