SQL Server的多表修改和删除的存储过程

开发工具与关键技术:存储过程

作者:邓崇富

撰写时间:2019 年8 月 7 日

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

存储过程的多表修改的原理和SQL多表修改的原理基本上是相同的,在存储过程里写多表修改时也需要一个必备条件就是一个ID或者是在字表里是唯一性的字段(在每一个子表里的所有数据中它都是唯一性的,就象每个表的主键ID,主键ID在每个表里都是自增并且是唯一性的);然后根据项目里传过来的这个条件,在子表查出该条数据,再根据该条数据查出父表的外键ID,再根据这个外键ID去查出父表的主键ID相等的那条数据,然后先修改父表里面的数据,父表数据修改完后,再返回来修改字表的数据,其他父表也是同理这样修改(当然要在子表和父表的关系是一对多的情况下才用这种方法);如果子表和父表是一对一的关系(或者是链式关系),先用项目中传过来的条件ID查出子表的该条数据,再用该条数据里的外键ID去查出父表主键相同的数据,以此类推,直到查出最底层那个父表的数据后,先修改最底层哪个父表的数据,然后再一步步往回修改表的数据即可(修改的顺序刚好和上面所说查询的顺序相反)。

下面是子表和父表是一对多关系的修改的详细的存储过程代码:

---保存修改费用种类信息

IF(@type='SaveUpdataCostCategory')

    BEGIN

        begin  

           Declare @CID int

           select @CID  = CurrencyCategoryID from SYS_ScheduleOfChar

           where  ScheduleOfChargesI = @ScheduleOfChargesID

           update SYS_CurrencyCatego

           set  CurrencyCode = @CurrencyCode

           where  CurrencyCategoryID = @CID

           update SYS_ScheduleOfChar

           set TheDefaultCode = @TheDefaultCode, ChineseName = @ChineseName,EnglishName = @EnglishName, TheDefaultUP = @TheDefaultUP, Collect = @Collect, Payment = @Payment, Commission = @Commission, SalesHiding = @SalesHiding

           where  ScheduleOfChargesI = @ScheduleOfChargesID     

        end

    END

代码的说明:Declare @CID int 是为了存放从子表里查出父表的外键ID声明一个变量@CID(一个存储过程中只能声明依次该变量名,即可以在多条存储语句中使用该变量);该select @CID  = CurrencyCategoryID from SYS_ScheduleOfChar  语句中的SYS_ScheduleOfChar是子表,CurrencyCategoryID是子表中外键ID;这个条件语句  where  ScheduleOfChargesI = @ScheduleOfChargesID里的@ScheduleOfChargesID是项目中传过来的条件;该update SYS_CurrencyCatego set  CurrencyCode = @CurrencyCode where  CurrencyCategoryID = @CID语句是修改父表数据语句,其中SYS_CurrencyCatego是父表,@CID是上面查出来的外键,CurrencyCategoryID是父表的主键;该update SYS_ScheduleOfChar

           set TheDefaultCode = @TheDefaultCode, ChineseName = @ChineseName,EnglishName = @EnglishName, TheDefaultUP = @TheDefaultUP, Collect = @Collect, Payment = @Payment, Commission = @Commission, SalesHiding = @SalesHiding

           where  ScheduleOfChargesI = @ScheduleOfChargesID语句是修改子表数据的,其中SYS_ScheduleOfChar是子表,条件里的ScheduleOfChargesI是子表的主键ID或者是子表的唯一性的字段,@ScheduleOfChargesID是项目里传过来的条件。

    存储过程里的多表删除也有很多中的写法,而我比较推荐的就是下面我介绍的这种写法,就是先删除父表再删除子表。多表删除的原理和多表修改的原理都是差不多的,只是关键字不一样罢了。在存储过程里写多表删除时也需要一个必备条件就是一个ID或者是在字表里是唯一性的字段(在每一个子表里的所有数据中它都是唯一性的,就象每个表的主键ID,主键ID在每个表里都是自增并且是唯一性的);然后根据项目里传过来的这个条件,在子表查出该条数据,再根据该条数据查出父表的外键ID,再根据这个外键ID去查出父表的主键ID相等的那条数据,然后先删除父表的数据,再删除子表的数据,其他父表也是同理这样删除(当然要在子表和父表的关系是一对多的情况下才用这种方法);如果子表和父表是一对一的关系(或者是链式关系),先用项目中传过来的条件ID查出子表的该条数据,再用该条数据里的外键ID去查出父表主键相同的数据,以此类推,直到查出最底层那个父表的数据后,先删除最底层哪个父表的数据,然后再一步步往回删除表的数据即可(删除的顺序刚好和上面所说查询的顺序相反)。这种多表删除方法的好处就是删除后,数据表中不会出现冗余数据。

下面是子表和父表是一对多关系的删除的详细的存储过程代码:

--删除船名/船次信息

IF(@type='DeleteShip')

    BEGIN

      select @CID  = ShipsNameID from PW_ShipsName

      where  ShipsNameID = @ShipsNameID

      Delete PW_ShipDate  

      where  ShipsNameID = @CID

      DELETE PW_ShipsName

      WHERE  ShipsNameID=@ShipsNameID

   END

说明:为了保证父表不会出现冗余数据,必须要先删除父表的数据,再删除子表的数据;如果是先删除子表的数据,父表里数据就无法删除了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值