作业问题:
编写一个名为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发布于 2018-11-23 05:45:37
在开始之前,您需要找到当前持有该区域的旧分发服务器:
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 - docs声明“新应用程序应该使用抛出”。开始使用不推荐语法的路径是不好的,如果这个代码框架来自他们,请与您的主管讨论。
考虑在TRY中启动事务,执行多个语句,并有一个CATCH块检查@@TRANCOUNT,并在事务大于0时回滚事务
https://stackoverflow.com/questions/53440729
复制相似问题