Вам нужно найти старого дистрибьютора, который в настоящее время владеет регионом, прежде чем начать:
DECLARE @oldDist INT = (SELECT distributorid FROM region WHERE regionid = @regionid);
Я не собираюсь выполнять всю работу за вас, потому что это учебное упражнение для вашей учебной выгоды,но что выше, в правильном месте, в сочетании с небольшим изменением копии вставки к уже написанному запросу, вы попадете туда, где вам нужно быть
Всегда всегда комментируйте свою работу при изучении
Используйте комментарии, чтобы сформировать алгоритм высокого уровня - очень немногие люди думают в коде, они думают на родном языке (например, английском) и переводят в код
Напишите алгоритм на английском языке как комментарии и оставьте их в
--check values passed are valid and refer to existing region /distrib; throw a not found error if not
--get the old distributor id we are transferring from-will need this later
--update to transfer to the new distrib
--update to increment new distrib wage
--update to decrement old distrib wage
Это то, что вы должны сначала написать, а затем ввести код под каждым комментарием для реализации комментария.
Другие советы:
Используйте точки с запятой - их пропуск теперь не рекомендуется
Не входите в несколько вложенных, если не иначе, это грязно и ненужно;Вы можете выполнить всю эту работу на уровне базового гнезда, потому что, если вы обнаружите ошибку и поднимете ее, процедура сработает в этот момент (если у вас в блоке try уровень серьезности должен быть больше 10, чтобы перейти к блоку catch)
Не использовать RAISERROR - в документации указано, что «новые приложения должны использовать throw вместо».Начинать использование устаревшего синтаксиса нехорошо, обсудите с вашим супервизором, произошел ли от этого скелет кода
Рассмотрите возможность запуска вашей транзакции в TRY, выполните несколько операторов и получите блок CATCH, который проверяет @@TRANCOUNT и откатывает транзакцию обратно, если она больше 0