MICROSOFT SQL Server, как обновить столбец после завершения передачи (домашнее задание) - PullRequest
0 голосов
/ 23 ноября 2018

Вопрос домашнего задания:

Напишите хранимую процедуру с именем TransferRegion, которая принимает RegionID и DistributorID.Процедура перенесет определенный регион от одного дистрибьютора к другому.Когда регион будет переведен, старый дистрибьютор получит 1,00 долл. США из своей зарплаты, а новый дистрибьютор получит 1,00 долл. США добавленной заработной платы.Убедитесь, что все необходимые таблицы обновлены в соответствии с требованиями.

Мой вопрос: как обновить заработную плату старого дистрибьютора после ее перевода?

CREATE PROCEDURE TransferRegion 
    (@RegionID INT = NULL, @DistributorID INT = NULL)
AS
    IF @RegionID IS NULL OR @DistributorID IS NULL
    BEGIN
        raiserror('Must provide a region id and distributor id',16,1)
    END
    else
    begin
        begin transaction

        update Region
        set DistributorID = @DistributorID
        where RegionID = @RegionID

        if @@ERROR<> 0
        begin
            raiserror('transfering distributor failed',16,1)
            rollback transaction
        end
        else
        begin
            update Distributor
            set wage = wage + 1
            where DistributorID = @DistributorID

            if @@ERROR<> 0
            begin
                raiserror('transfering distributor failed',16,1)
                rollback transaction
            end
            else
            begin
                commit transaction
            end
        end
    end
    return

1 Ответ

0 голосов
/ 23 ноября 2018

Вам нужно найти старого дистрибьютора, который в настоящее время владеет регионом, прежде чем начать:

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

...