sqlserver中操作主從關系表的sql語句。本站提示廣大學習愛好者:(sqlserver中操作主從關系表的sql語句)文章只能為提供參考,不一定能成為您想要的結果。以下是sqlserver中操作主從關系表的sql語句正文
典范的辦法就是關於主表的各數據字段停止更新或新增,關於從表普通都邑先刪除相干的一切記載,然後再停止拔出。也就是說每次保留時,從表的數據都要從新履行一遍刪除再拔出的進程。這是一個不錯的辦法,在應用數據庫事務後,不會存在刪除後又沒有拔出招致數據紛歧致的情形。
ok,道理是如許,那末到現實的操作中,年夜家若何操作的呢?有人經由過程在法式中,經由過程屢次數據庫操作完成如上的請求,這類辦法能夠存在這數據的紛歧致性,由於沒法包管在兩個數據語句操作之間湧現不測。那末我們就歸並到一個存儲進程中去完成吧,龐雜的參數和吸收後處置,讓這個存儲進程變的艱苦。下邊我就聯合現實運用說說此進程吧。運用場景,在先生治理中,添加一條先生記載,對應的要 添加先生對應的課程。即每次更新和新增先生記載,對應其課程也要隨著變更。
那末這個進程,就相符上邊的邏輯。
通用的參數傳遞,在此不再詳說,重點講授,科目信息傳遞事後怎樣處置。假定從表Tb_StudentSubject 存在StudentId,SubjectId兩個字段。那末代碼以下:
Create proc SaveInfo
(
---參數列表不再一一書寫
@subjectList varchar(400))
as
begin tran
--新增或修正主表 省略
DECLARE @subjectID int,
@subjectIDsLen int,--科目長度
@subjectIDLen int,--單個科目長度
@nStart INT , -- 記載查找的肇端地位
@nLast INT -- 記載‘,'的地位
select @subjectIDsLen=len(@SubjectIDs),@nStart=1,@nLast=0
DELETE Tb_StudentSubject WHERE StudentId=@sId --刪除相干的全體記載
IF(@subjectIDsLen>0)
BEGIN
while(@nStart<@subjectIDsLen)
BEGIN
set @nLast=charindex(',',@SubjectIDs,@nStart)--從第@nStart個地位開端記載逗號的地位
set @subjectIDLen=@nLast-@nStart --記載每一個subjectID的長度
set @subjectID=substring(@SubjectIDs,@nStart,@subjectIDLen)--獲得一個subjectID
Insert Into Tb_StudentSubject(StudentId,SubjectID)values(@sId,@subjectID)
set @nStart=@nLast+1--設置下次查找的肇端地位
END
END
if @@Error=0
commit transaction
else
rollback transaction
End
在這邊代碼中,科目列表經由過程“,”停止朋分,上邊的存儲進程帶正文,重點解釋兩個體系自帶的函數
CHARINDEX ( expression1 ,expression2 [ , start_location ] )
expression1 :個中包括要查找的字符的序列
expression2 :平日是一個為指定序列搜刮的列
start_location :開端在 expression2 中搜刮 expression1 時的字符地位。假如 start_location 未被指定、是一個正數或零
另外一個函數就是:SUBSTRING ( expression ,start , length )從指定的數據源串中從指定地位截取指定長度的串
個中 expression :是字符串、二進制字符串,要操作的數據源串
start:要截取的開端地位,留意此辦法和C#自帶的地位紛歧樣,數據庫中strat從1開端,法式中從0開端
length:截取內容的長度
別的一個就len(expres) 這個就比擬簡略了,獲得指定字符的長度
經由過程以上代碼,便可以完成一個完全存儲進程完成主從表數據的處置了,在數據分歧性和操作便捷性獲得包管,並且雷同通用。
注:在觸及相似主從關系表中,建議不要在從表中設置主動編號的主鍵,由於頻仍的刪除和添加,招致主鍵赓續的累增,並且毫無應用此主鍵的意義。
以上內容是小我看法,願望年夜家多交換響應的辦法。