标签:tps exec 举例 代码 upd 批量删除 sid rom 简单
--我们就以院系,班级,学生来举例。 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 varchar(30)--字符串表名 @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代码了。
Sqlserver 实际开发中常见的数据库操作增删改查----改
标签:tps exec 举例 代码 upd 批量删除 sid rom 简单
原文地址:https://www.cnblogs.com/zpy1993-09/p/11798349.html