為什么阿里巴巴禁止使用存儲(chǔ)過(guò)程?
300本計(jì)算機(jī)編程的經(jīng)典書籍下載
AI全套:Python3+TensorFlow打造人臉識(shí)別智能小程序
最新人工智能資料-Google工程師親授 Tensorflow-入門到進(jìn)階
黑馬頭條項(xiàng)目 - Java Springboot2.0(視頻、資料、代碼和講義)14天完整版
作者:楊洋的圍脖啊
來(lái)源:segmentfault.com/a/1190000011138993
翻看了代碼發(fā)現(xiàn),系統(tǒng)的用戶個(gè)人頁(yè)面的C#代碼調(diào)用了三個(gè)存儲(chǔ)過(guò)程,去抓取用戶的Job,Certification,Disclosure數(shù)據(jù)。
我的新需求,自然需要復(fù)用這三個(gè)存儲(chǔ)過(guò)程,否則:
如果我在C#代碼中調(diào)用這已有的三個(gè)存儲(chǔ)過(guò)程,事情本該非??炀湍芙Y(jié)束。我也是這么做的。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師后臺(tái)回復(fù)“2T”,獲取一份驚喜禮包。
也對(duì)。除開(kāi)網(wǎng)絡(luò)性能,從接口設(shè)計(jì)的角度講,接口的傳入和返回值,都應(yīng)是你本身需要的數(shù)據(jù),不應(yīng)帶有大量不需要或者需要caller去預(yù)處理的數(shù)據(jù)。從接口語(yǔ)義表達(dá)就可知調(diào)用的目的,這樣代碼可讀性也會(huì)有大大提高。
那就動(dòng)手改。但沒(méi)想到的是問(wèn)題來(lái)了。
為了講述問(wèn)題,我簡(jiǎn)化代碼,假設(shè)系統(tǒng)現(xiàn)有的存儲(chǔ)過(guò)程如下:
CREATE?PROCEDURE?[dbo].[GetJobs]
(
????@PersonId?int,
????@OrganizaitionId?int
?)
AS
BEGIN
??SELECT?JobId,JobName,JobType?FROM?Job?WHERE?PersonId?=?@PersonId?AND?OrganizaitionId?=?@OrganizaitionId
END
GetJobs返回結(jié)果集的count。count(*)的計(jì)數(shù)操作:CREATE?PROCEDURE?[dbo].[MyProc]
(
????@PersonId?int,
????@OrganizaitionId?int,
?)
AS
BEGIN
??CREATE?TABLE?#Temp(
????PersonId?int,
????OrganizaitionId?int
??)
??INSERT?INTO?#Temp?EXEC?dbo.GetJobs
????@PersonId?=?@PersonId,
????@ParentOrgId?=?@ParentOrgId
??SELECT?COUNT(*)?FROM?#Temp
END
MyProc中的臨時(shí)表結(jié)構(gòu)也需要隨之變化。這是令人難以接受的。那么將MyProc中的INSERT INTO換為SELECT INTO呢?很遺憾,答案是不行。SQL本身并不支持這種用法。
搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師后臺(tái)回復(fù)“2T”,獲取一份驚喜禮包。
給現(xiàn)有存儲(chǔ)過(guò)程GetJobs加output參數(shù)?本例中因?yàn)镚etJobs已被其他多處代碼或SQL scripts調(diào)用,所以對(duì)現(xiàn)有現(xiàn)有存儲(chǔ)過(guò)程進(jìn)行改動(dòng)會(huì)有不小風(fēng)險(xiǎn)。
最終我沒(méi)能找到一種滿意的辦法,無(wú)奈之下我在新寫的存儲(chǔ)過(guò)程中將查詢Jobs的語(yǔ)句寫一了次。
天知道還有沒(méi)有機(jī)會(huì)和那位前同事再討論這一話題呢。
全棧架構(gòu)社區(qū)交流群
?「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進(jìn)行加群。歡迎有想法、樂(lè)于分享的朋友們一起交流學(xué)習(xí)。
看完本文有收獲?請(qǐng)轉(zhuǎn)發(fā)分享給更多人
往期資源:
