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表中信息工程學院改爲藝術設計學院html

 ,雖然名字改了,可是Id沒有變,可能你們會說,對應Class表中的班級不是也要改變嗎,是的,是須要改變的,可是咱們能夠在班級列表的界面中點擊編輯按鈕進行編輯,從新給班級命名就i行了。web

由於Id沒有變。若是不想編輯,那就找到班級列表對這些班級進行刪除,或批量刪除就好了,而刪除方式在個人筆記中(http://www.javashuo.com/article/p-rojoxhzg-ho.html)已經作了詳細介紹了。sql

      這裏我要作另外一種修改方式,上面的表好像沒有適用場景,和上面的表不要緊了。下面我要說的是我在開發中經常使用的一種修改方式了,這種修改時帶有必定邏輯型的修改,可不是修改一張死表那麼簡單了。仍是舉個例子吧!這個例子是web平臺和手機APP互相配合的。數據庫

      好比一個任務表,一個任務步驟表和一個任務模板列表,(其實還須要步驟模板表的,添加的任務屬於哪一個任務模板,添加的步驟屬於哪一個步驟模板,這樣才合理,可是這裏就簡化了,直接用三個表了)spa

      任務表中我在表中添加一個任務,而這個任務須要作3個步驟才能算完成任務。我把這個任務分配給了張三,而張三打開手機APP就應該看到屬於本身的任務了。他要作的就是把3個步驟完成,而後提交併存儲到數據裏的步驟表中。仍是把表建起來才能看的明白:翻譯

     TaskStateID:表示任務狀態Id   數字表明:   1:未開始 2:處理中 3:待審覈 4:已完成設計

     TaseMoBanID:表示該任務屬於哪一個任務模板code

具體流程:把任務派給張三,TaskStateID=1 任務未開始,若是張三完成了一部分任務,TaskStateID=2  任務已經在處理中  當張三把全部步驟都作完的時候,TaskStateID=3 任務屬於待審覈。 最後的審覈是有任務發起者審覈,若是審覈經過 那麼 TaskStateID=4 任務已完成htm

   好比我任務已經派給張三了,那麼TaskStateID應該是1,任務還未開始,blog

       咱們知道任務要三個步驟才能完成,張三每完成一個任務,他就要提交一次。在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代碼了。

相關文章
相關標籤/搜索