zoukankan      html  css  js  c++  java
  • Sqlserver 增删改查----改

    --我们就以院系,班级,学生来举例。
     create TABLE [dbo].YuanXi
      (
       Id int IDENTITY(1,1) NOT NULL,--学校id 自增量
       YuanXiName varchar(50) null, --院系名字
       
      )
     create TABLE [dbo].Class
      (
       Id int IDENTITY(1,1) NOT NULL,--班级id 自增量
       YuanXiID int null,--院系id
       ClassName varchar(50) null --班级名字
      
      )
     create TABLE [dbo].Student
      (
       Id int IDENTITY(1,1) NOT NULL,--学生id 自增量
       ClassID  int null,--班级id
       StudentName varchar(50) null,--学生姓名
      )
    --这个表是图片表,我临时加的,后面可能用这个演示 
    create TABLE [dbo].PathImg
      (
       
       Id int IDENTITY(1,1) NOT NULL,--学校id 自增量
       TableName   varchar(50) null,   --这个是表明,比如我要在信息工程学院价格图片,那就要在改表中把XuanXi表的表名子加上,还有信息工程学院的id加上
       TableNameId  int null,--这个就是某一个表中的某一个id
       Path varchar(50) null, --存放班级照片路径的
      )

      改就相对的容易多了,因为修改的时候主键一定不会变的(也就是表中的自增id了) ,至于改其他信息那就不会影响到其他表了,就算影响,比如我修改了YuanXi表中信息工程学院改成艺术设计学院

     ,虽然名字改了,但是Id没有变,可能大家会说,对应Class表中的班级不是也要改变吗,是的,是需要改变的,但是我们可以在班级列表的界面中点击编辑按钮进行编辑,重新给班级命名就i行了。

    因为Id没有变。如果不想编辑,那就找到班级列表对这些班级进行删除,或批量删除就行了,而删除方式在我的笔记中(https://www.cnblogs.com/zpy1993-09/p/11786057.html)已经做了详细介绍了。

          这里我要做另一种修改方式,上面的表好像没有适用场景,和上面的表没关系了。下面我要说的是我在开发中常用的一种修改方式了,这种修改时带有一定逻辑型的修改,可不是修改一张死表那么简单了。还是举个例子吧!这个例子是web平台和手机APP互相配合的。

          比如一个任务表,一个任务步骤表和一个任务模板列表,(其实还需要步骤模板表的,添加的任务属于哪个任务模板,添加的步骤属于哪个步骤模板,这样才合理,但是这里就简化了,直接用三个表了)

          任务表中我在表中添加一个任务,而这个任务需要做3个步骤才能算完成任务。我把这个任务分配给了张三,而张三打开手机APP就应该看到属于自己的任务了。他要做的就是把3个步骤完成,然后提交并存储到数据里的步骤表中。还是把表建起来才能看的明白:

         TaskStateID:表示任务状态Id   数字代表:   1:未开始 2:处理中 3:待审核 4:已完成

         TaseMoBanID:表示该任务属于哪个任务模板

    具体流程:把任务派给张三,TaskStateID=1 任务未开始,如果张三完成了一部分任务,TaskStateID=2  任务已经在处理中  当张三把所有步骤都做完的时候,TaskStateID=3 任务属于待审核。 最后的审核是有任务发起者审核,如果审核通过 那么 TaskStateID=4 任务已完成

       比如我任务已经派给张三了,那么TaskStateID应该是1,任务还未开始,

           我们知道任务要三个步骤才能完成,张三每完成一个任务,他就要提交一次。在step表中添加步骤记录,添加这里不说,之说修改,我们这时候就应该把Task表中TaskStateID的状态修改为2处理中。但是在修改的时候数据库有不知道,你到底完成了多少步骤,他只会修改,你可能只完成1步,也可能都完成了。这就需要我们在数据库中用逻辑来判断了。

        首先判断当前张三完成了多少步骤,首先提交的时候会传到数据库中两个参数;一个是 :TableName:表名     TableNameID :任务ID

    我们这里直接定义方便后面写存储过程:

        @TableName varchar(30)

        @TabaleNameID int

         1,从step表中查找记录数

          select Count(*) from Step where TableName=@TableName  and  TableNameID=@TableNameID

        2,查找完成该任务一共需要多少步骤。(这里要注意,这个修改是通用的。所以TableName传过来的是数据库中某一张表的表名字。是通过字符串表名来查数据库的,所以和上面的不一样,这个需要字符串拼接成sql语句了)

      先找到任务模板的id

        EXEC('SELECT TaskMoBanID  FROM ' +@TableName+'where Id ='+@TableNameID)  --这句sql代码翻译一下就是 执行sql语句:select TaskMoBanID from Task where Id =@TableNameID

       通过任务模板id找到该任务完成需要的步骤数:

        select  MoBanStepCount  from taskMoBan where Id=上一步得到ID

    3,拿张三当前提交后完成了多少步骤数与完成该任务的步骤数对比(注意,张三在APP上打开步骤数的时候已经有三个步骤显示了,只是需要他去编辑完成,他不具有添加步骤的能力,步骤已经被模板限死了)

          if 当前步骤数<完成该任务的步骤数

             把任务状态  修改成TaskStateID=2 (处理中)

            update Task set TaskMoBanID=2   where  Id=@TableNameID

        else 

           update Task set TaskMoBanID=3  where  Id=@TableNameID

    整理一下写个存储过程

    USE [TestData]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[alterDemo]
      @TableName varchar30--字符串表名
    
      @TabaleNameID int--表名id
    
    AS 
    --定义两个个变量,用来接收当前步骤数和完成该任务的总步骤数
      declare @CurrentStepCount int 
      declare @SumStepCount int 
     --查询当前记录数,并赋值给变量
    set @CurrentStepCount=(select count(*) from  Step where TableName=@TableName  and  TableNameID=@TableNameID)
    --查询完成该任务的总步骤数,并赋值给变量
       --注意红字,这个变量的定义一定要放在字符里面,如果像前两个一样放在外面,执行这个语句就会报错的,一定要注意
      set @SumStepCount=EXEC('delcare @TaskMoBanID varchar(30) SELECT @TaskMoBanID=TaskMoBanID  FROM ' +@TableName+'where Id ='+@TableNameID+'select  MoBanStepCount  from taskMoBan where Id=@TaskMoBanID')  
    if @CurrentStepCount<@SumStepCount
          update Task set TaskMoBanID=2   where  Id=@TableNameID
    else
         update Task set TaskMoBanID=3  where  Id=@TableNameID

    --上面EXEC()执行的字符语句翻译普通sql语句:
    delcare @TaskMoBanID varchar(30)//临时任务模板id的存储变量
    SELECT @TaskMoBanID=TaskMoBanID FROM Task where Id =@TableNameID //用该变量接受查询的结果
    select MoBanStepCount from taskMoBan where Id=@TaskMoBanID//根据查询的结果,再次查询模板表中该任务模板的步骤数

           好了,修改就说到这里了,实际上一般都是单个表,毕竟修改的时候主键又不会变,其他影响的在平台上直接在编辑一下就行了。要么直接删除就行了,反而更省事些,但是就像上面我说的那种带有逻辑模式的,那就要老老实实的写sql代码了。

  • 相关阅读:
    欧几里得学习笔记
    卢卡斯定理学习笔记
    环相关问题
    BSGS学习笔记
    淘宝首页自动切换选项卡变换内容
    彻底弄懂CSS盒子模式(DIV布局快速入门)
    runoo' blog WEB2.0
    彻底弄懂CSS盒子模式
    CSS 样式切换
    js强贴收藏
  • 原文地址:https://www.cnblogs.com/zpy1993-09/p/11798349.html
Copyright © 2011-2022 走看看