在上篇博客中介紹到了觸發器的使用,而且當中也提到了觸發器是個特殊的存儲過程,那么什么是存儲過程呢?他們
兩個又究竟有什么差別呢?
事實上最基本的差別就是,觸發器是當滿足條件時系統自己主動運行的,而存儲過程是手動調用的。
?
簡介
?
什么是存儲過程?
定義:將經常使用的或非常復雜的工作,預先用SQL語句寫好并用一個指定的名稱存儲起來,用戶通過指定存儲過程的名字
并給出參數(假設該存儲過程帶有參數)來調用它。
說到這里,可能有人要問:這么說存儲過程不就是一堆SQL語句而已嗎?那么存儲過程與一般的SQL語句有什么差別
呢?
存儲過程有它獨到的長處不單單僅僅是把一堆SQL語句堆積到一塊:
????? 1. 存儲過程僅僅在創造時進行編譯,以后每次運行存儲過程都不需再又一次編譯,而一般SQL語句每運行一次就編譯
一次,所以使用存儲過程可提高數據庫運行速度。
????? 2. 當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封
裝起來與數據庫提供的事務處理結合一起使用。
????? 3. 存儲過程能夠反復使用,可降低數據庫開發者的工作量
????? 4. 安全性高,可設定僅僅有某此用戶才具有對指定存儲過程的使用權
?
存儲過程的種類:
?
?? 1. 系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作,如sp_help就是取得指定對象的相關
信息
?? 2. 擴展存儲過程??以XP_開頭,用來調用操作系統提供的功能
?? 3. 用戶自己定義的存儲過程,這是我們所指的存儲過程
?
怎樣使用
?
?
這么好的一個東西,該怎么應用在系統中呢?
以機房收費系統的退卡功能為例。
-
第一步也是思考,思考這個功能涉及到了幾條SQL語句(假設就一條就不必建立存儲過程了),
把SQL語句都列出來:
delete Card_info? where CID = @CID????????????????????????????????????????????????????????????????? 刪除卡表中相應卡號的信息
delete Student_info?? where SID = @SID?????????????????????????????????????????????????????????????依據卡號相應的學號刪除學生表相應學號信息
insert into ReturnCard_info (CID,ReturnCash ,UID ,Rdate ,Rtime ) values(@CID ,@ReturnCash ,@UID ,@Rdate,@Rtime)???????????????????????????????????????????????添加退卡信息到退卡記錄表
?
-
建立存儲過程? 如圖: 在對應數據庫下打開可編程性,新建存儲過程
?????????????????????????????????? ?
-
加入對應存儲過程的代碼
--============================================= --Author: 牛遷遷 --Create date: 2014年6月11日 --Description: 退卡,刪除Card_info,Line_info,Student_info,Recharge_info,同一時候加入ReturnCard_info --============================================= ALTER PROCEDURE [dbo].[PROC_ReturnCard] -- 命名規范 PROC_ + 名稱 --Add the parameters for the stored procedure here @CID varchar(20),@ReturnCashvarchar(20),@UID varchar(20), -- 加入用到的參數 @Rdatevarchar(20),@Rtime varchar(20),@SID varchar(20) AS BEGIN --SET NOCOUNT ON added to prevent extra result sets from --interfering with SELECT statements. SETNOCOUNT ON; -- Insert statements forprocedure here -- 加入涉及到的SQL語句 deleteCard_info where CID = @CID deleteStudent_info where SID = @SID insertinto ReturnCard_info (CID ,ReturnCash ,UID ,Rdate ,Rtime ) values(@CID,@ReturnCash ,@UID ,@Rdate ,@Rtime) END </span>
-
調用存儲過程 (D層)
<span style="font-family:Microsoft YaHei;"> Public Function ReturnCard(ENCardinfo As EN_Card_info, ENStudentinfo As EN_Student_info, ENLineinfo As EN_Line_info,ENReturnCardinfo As EN_ReturnCard_info) As Integer ImplementsIReturnCard.ReturnCard Dim strSql As String ="PROC_ReturnCard" '這里的strSql不再存放單條SQL語句,而是存儲過程 '定義所需的參數 Dim sqlParams As SqlParameter() = {NewSqlParameter("@CID", ENCardinfo.CID), NewSqlParameter("@SID", ENStudentinfo.SID), NewSqlParameter("@ReturnCash", ENReturnCardinfo.ReturnCash), NewSqlParameter("@UID", ENReturnCardinfo.UID), NewSqlParameter("@Rdate", ENReturnCardinfo.Rdate), NewSqlParameter("@Rtime", ENReturnCardinfo.Rtime)} '注意這里的CommandType不再是文本命令(CommandType.Text)而是CommandType.StoredProcedure ReturnclsSqlHelper.ExecAddDelUpdate(strSql, CommandType.StoredProcedure, sqlParams) End Function </span>
?
??????? 假設沒有存儲過程的話,完畢這個過程,須要編寫五個函數:刪除卡信息的函數、刪除學生信息的函數、刪除
上級記錄的函數、刪除充值記錄的函數、添加退卡記錄的函數;然后再一個個調用,不僅代碼繁多,并且關系亂;使
用存儲過程僅僅須要編寫一個函數就能夠完畢五個函數的工作,使代碼邏輯變得簡單化。
存儲過程和觸發器,事實上就是把SQL語句封裝到了數據庫中,觸發器能完畢的工作,存儲過程一般也能完畢,可是選
擇的時候要優先使用存儲過程。
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
