首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MICROSOFT SQL Server如何在传输完成后更新列(作业)

MICROSOFT SQL Server如何在传输完成后更新列(作业)
EN

Stack Overflow用户
提问于 2018-11-23 04:39:53
回答 1查看 49关注 0票数 0

作业问题:

编写一个名为TransferRegion的存储过程,它接受RegionIDDistributorID。此过程将将特定区域从一个分销商转移到另一个分销商。当该地区转移时,旧分销商将从其工资中减去1.00美元,而新分销商将增加1.00美元的工资。确保根据需要更新所有必要的表。

我的问题是:转帐后如何更新旧的经销商工资?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-23 05:45:37

在开始之前,您需要找到当前持有该区域的旧分发服务器:

代码语言:javascript
复制
DECLARE @oldDist INT = (SELECT distributorid FROM region WHERE regionid = @regionid);

我不会为你做所有的工作,因为这是一个学术练习,对你的学习有好处,但上面,在正确的地方,再加上对你已经写好的查询的稍微拷贝粘贴更改,你将到达你需要的地方。

学习时总是评论你的工作。

使用注释来形成高级算法--很少有人用代码思考,他们用母语思考(如英语)并翻译成代码。

用英文写算法作为注释,然后把它们留在

代码语言:javascript
复制
--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时回滚事务

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53440729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档