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代码了。

猜你喜欢

转载自www.cnblogs.com/zpy1993-09/p/11798349.html