sqlserver中操作主從關(guān)系表的sql語(yǔ)句
ok,原理是這樣,那么到實(shí)際的操作中,大家如何操作的呢?有人通過(guò)在程序中,通過(guò)多次數(shù)據(jù)庫(kù)操作完成如上的要求,這種方法可能存在這數(shù)據(jù)的不一致性,因?yàn)闊o(wú)法保證在兩個(gè)數(shù)據(jù)語(yǔ)句操作之間出現(xiàn)意外。那么我們就合并到一個(gè)存儲(chǔ)過(guò)程中去完成吧,復(fù)雜的參數(shù)和接收后處理,讓這個(gè)存儲(chǔ)過(guò)程變的困難。下邊我就結(jié)合實(shí)際應(yīng)用說(shuō)說(shuō)此過(guò)程吧。應(yīng)用場(chǎng)景,在學(xué)生管理中,添加一條學(xué)生記錄,對(duì)應(yīng)的要 添加學(xué)生對(duì)應(yīng)的課程。即每次更新和新增學(xué)生記錄,對(duì)應(yīng)其課程也要跟著變化。
那么這個(gè)過(guò)程,就符合上邊的邏輯。
通用的參數(shù)傳遞,在此不再詳說(shuō),重點(diǎn)講解,科目信息傳遞過(guò)后怎么處理。假設(shè)從表Tb_StudentSubject 存在StudentId,SubjectId兩個(gè)字段。那么代碼如下:
Create proc SaveInfo
(
---參數(shù)列表不再逐一書(shū)寫(xiě)
@subjectList varchar(400))
as
begin tran
--新增或修改主表 省略
DECLARE @subjectID int,
@subjectIDsLen int,--科目長(zhǎng)度
@subjectIDLen int,--單個(gè)科目長(zhǎng)度
@nStart INT , -- 記錄查找的起始位置
@nLast INT -- 記錄‘,'的位置
select @subjectIDsLen=len(@SubjectIDs),@nStart=1,@nLast=0
DELETE Tb_StudentSubject WHERE StudentId=@sId --刪除相關(guān)的全部記錄
IF(@subjectIDsLen>0)
BEGIN
while(@nStart<@subjectIDsLen)
BEGIN
set @nLast=charindex(',',@SubjectIDs,@nStart)--從第@nStart個(gè)位置開(kāi)始記錄逗號(hào)的位置
set @subjectIDLen=@nLast-@nStart --記錄每個(gè)subjectID的長(zhǎng)度
set @subjectID=substring(@SubjectIDs,@nStart,@subjectIDLen)--獲取一個(gè)subjectID
Insert Into Tb_StudentSubject(StudentId,SubjectID)values(@sId,@subjectID)
set @nStart=@nLast+1--設(shè)置下次查找的起始位置
END
END
if @@Error=0
commit transaction
else
rollback transaction
End
在這邊代碼中,科目列表通過(guò)“,”進(jìn)行分割,上邊的存儲(chǔ)過(guò)程帶注釋?zhuān)攸c(diǎn)說(shuō)明兩個(gè)系統(tǒng)自帶的函數(shù)
CHARINDEX ( expression1 ,expression2 [ , start_location ] )
expression1 :其中包含要查找的字符的序列
expression2 :通常是一個(gè)為指定序列搜索的列
start_location :開(kāi)始在 expression2 中搜索 expression1 時(shí)的字符位置。如果 start_location 未被指定、是一個(gè)負(fù)數(shù)或零
另一個(gè)函數(shù)就是:SUBSTRING ( expression ,start , length )從指定的數(shù)據(jù)源串中從指定位置截取指定長(zhǎng)度的串
其中 expression :是字符串、二進(jìn)制字符串,要操作的數(shù)據(jù)源串
start:要截取的開(kāi)始位置,注意此方法和C#自帶的位置不一樣,數(shù)據(jù)庫(kù)中strat從1開(kāi)始,程序中從0開(kāi)始
length:截取內(nèi)容的長(zhǎng)度
另外一個(gè)就len(expres) 這個(gè)就比較簡(jiǎn)單了,獲取指定字符的長(zhǎng)度
通過(guò)以上代碼,就可以實(shí)現(xiàn)一個(gè)完整存儲(chǔ)過(guò)程實(shí)現(xiàn)主從表數(shù)據(jù)的處理了,在數(shù)據(jù)一致性和操作便捷性得到保證,而且相同通用。
注:在涉及類(lèi)似主從關(guān)系表中,建議不要在從表中設(shè)置自動(dòng)編號(hào)的主鍵,因?yàn)轭l繁的刪除和添加,導(dǎo)致主鍵不斷的累增,而且毫無(wú)使用此主鍵的意義。
以上內(nèi)容是個(gè)人見(jiàn)解,希望大家多交流相應(yīng)的方法。
相關(guān)文章
sqlserver 文件數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)的比較
本文概要地從數(shù)據(jù)格式、數(shù)據(jù)庫(kù)結(jié)構(gòu)和WEB發(fā)布數(shù)據(jù)三個(gè)方面比較了文件數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)的異同,同時(shí)差別了文件數(shù)據(jù)庫(kù)和過(guò)去存儲(chǔ)數(shù)據(jù)的文件系統(tǒng)的不同2011-10-10SQL參數(shù)化查詢(xún)的另一個(gè)理由 命中執(zhí)行計(jì)劃
為了提高數(shù)據(jù)庫(kù)運(yùn)行的效率,我們需要盡可能的命中執(zhí)行計(jì)劃,這樣就可以節(jié)省運(yùn)行時(shí)間2012-08-08SQL Server游標(biāo)的使用/關(guān)閉/釋放/優(yōu)化小結(jié)
游標(biāo)打破了這一查詢(xún)的思考是面向集合的規(guī)則,游標(biāo)使得我們思考方式變?yōu)橹鹦羞M(jìn)行,接下來(lái)為大家介紹下游標(biāo)的使用感興趣的朋友可以參考下哈,希望可以幫助到你2013-03-03SQL Server約束增強(qiáng)的兩點(diǎn)建議
我們可以在CHECK的約束條件中加入任何邏輯表達(dá)式,而目前所有外鍵只能用來(lái)驗(yàn)證一個(gè)或多個(gè)列的值是否相等。2009-05-05快速插入大量數(shù)據(jù)的asp.net代碼(Sqlserver)
目標(biāo)數(shù)據(jù)庫(kù)只能是Sqlserver 來(lái)源數(shù)據(jù)庫(kù) 無(wú)所謂 只要能用ado.net 將來(lái)源數(shù)據(jù)讀取到Dataset或者Datareader 中就可以了。2011-02-02沒(méi)有sa密碼無(wú)法集成windows身份驗(yàn)證登錄的解決方法
以前都是通過(guò)windows集成身份驗(yàn)證登錄進(jìn)去的(sa密碼早忘記了),今天就改了服務(wù)器的機(jī)器名,現(xiàn)在無(wú)論如何都登錄不進(jìn)去,下面是解決方法2014-01-01SQL語(yǔ)句中的DDL類(lèi)型的數(shù)據(jù)庫(kù)定義語(yǔ)言操作
這篇文章主要介紹了SQL語(yǔ)句中的DDL類(lèi)型的數(shù)據(jù)庫(kù)定義語(yǔ)言,主要是用來(lái)定義數(shù)據(jù)庫(kù)中的對(duì)象的,例如數(shù)據(jù)庫(kù)、表和字段的定義,簡(jiǎn)單的理解就是DDL語(yǔ)言是來(lái)操作數(shù)據(jù)庫(kù)、表和字段的,需要的朋友可以參考下2022-08-08如何恢復(fù)SQL Server 2000損壞的數(shù)據(jù)庫(kù)文件
在現(xiàn)實(shí)情況中由于硬件和軟件的原因可能導(dǎo)致數(shù)據(jù)庫(kù)文件損壞,那么損壞的數(shù)據(jù)庫(kù)文件有沒(méi)有辦法修復(fù)呢?下面講講如何恢復(fù)SQL Server 2000損壞的數(shù)據(jù)庫(kù)文件2014-01-01SQLServer 2005 實(shí)現(xiàn)數(shù)據(jù)庫(kù)同步備份 過(guò)程-結(jié)果-分析
簡(jiǎn)單來(lái)說(shuō),數(shù)據(jù)庫(kù)復(fù)制就是由兩臺(tái)服務(wù)器,主服務(wù)器和備份服務(wù)器,主服務(wù)器修改后,備份服務(wù)器自動(dòng)修改2012-06-06