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