Я бы создал несколько отдельных хранимых процедур, а затем использовал бы транзакцию, чтобы убедиться, что вставки были зафиксированы вместе.
Вам понадобятся отдельные SP, чтобы добавить дополнительных участников, жанры и т. Д. Для меня не имеет большого смысла иметь один большой SP и весь код поддержки, который входит в вызов SP для добавления новый фильм + роль + жанр, а затем есть отдельные SP (и код поддержки) для дублирования добавления ролей и жанров. Использование транзакции эффективно объединит все ваши отдельные SP в одно действие, делая его почти похожим на один SP, но предоставляя вам гибкость в использовании отдельных SP.
Вам в любом случае понадобится код поддержки, чтобы звонить каждому из отдельных SP. Код, который будет проверять параметры, обрабатывать ошибки, устанавливать значения SP и т. Д. Таким образом, вам понадобятся такие функции, как AddRole, AddGenre и т. Д. В вашем приложении. Я предпочел бы иметь одну функцию в моем коде под названием AddMovie, которая запускает транзакцию, а затем вызывает каждую из этих отдельных функций. Разбейте работу на маленькие, легко тестируемые части, а затем создайте большие функции (AddMovie), вызывая меньшие части, которые, как вы знаете, работают. Было бы намного сложнее создать функцию AddMovie, которая вызвала бы другой SP, который в основном делает много тех же вещей, что и части, которые у вас уже есть.