pingpang

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            21 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(1)

          我參與的團(tuán)隊(duì)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

              存儲(chǔ)過程是一組預(yù)先編譯好的sql語句。將他放在服務(wù)器上面,由用戶通過指定存儲(chǔ)過程的名字來執(zhí)行它。

                  存儲(chǔ)過程的優(yōu)點(diǎn):

                  封裝——可用于操作數(shù)據(jù)庫對象的方法,用戶只需要知道它的輸入輸出參數(shù)并理解其目的即可。

                  改善性能——已經(jīng)預(yù)先編譯

                  減少網(wǎng)絡(luò)流量——只返回最后的結(jié)果集

                  重要性——針對復(fù)雜邏輯,應(yīng)用已經(jīng)測試號的存儲(chǔ)過程,不容易發(fā)生錯(cuò)誤。

                  安全性——如果數(shù)據(jù)庫擁有者DBO或者系統(tǒng)管理員SA編譯并保存了存儲(chǔ)結(jié)構(gòu),存儲(chǔ)過程就有了對它使用的數(shù)據(jù)庫對象的所有訪問權(quán)限。因此系統(tǒng)管理員可以向單獨(dú)的用于授予對數(shù)據(jù)對象的最小訪問權(quán)限,而不是直接允許用戶使用數(shù)據(jù)庫對象。

                  這次項(xiàng)目開發(fā)中運(yùn)用了不少的存儲(chǔ)過程,中間遇到了一個(gè)小問題,大家可以看看:

                  事情是這樣的:我想根據(jù)卡號、教師編號、教師姓名、聯(lián)系電話這四個(gè)條件查詢教師編號,這四個(gè)條件可以不存在,可以只存在一個(gè),可以只存在兩個(gè),可以只存在三個(gè),可以存在四個(gè)。開始我寫的存儲(chǔ)過程是這樣的

          1. <span style="font-size:24px;">CREATE PROCEDURE [dbo].[procCardByMore]</span>  
          2.     @cardNo varchar (50),  
          3.     @TeacherID varchar(50),   
          4.     @Name varchar(50),  
          5.     @telephone varchar(50)    
          6. AS   
          7. DECLARE @sql varchar(1000)   
          8. SET @sql='SELECT TeacherID as 教師編號,Name as 教師姓名,GradeName as 所屬年級,cardNo as 卡號,cash as 卡內(nèi)余額,realName as 管理員,OpenTime as 開卡時(shí)間,state as 狀態(tài),telephone as 聯(lián)系電話 FROM view_CardDetail '  
          9.   
          10. IF(@cardNo <>'')   
          11. BEGIN   
          12. SET @sql=@sql+'and  cardNo ='''+@cardNo+''''  
          13. END  
          14.   
          15. IF(@TeacherID <>'')   
          16. BEGIN   
          17. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
          18. END  
          19.   
          20. IF(@Name <>'')   
          21. BEGIN   
          22. SET @sql=@sql+'and  Name ='''+@Name +''''  
          23. END  
          24.   
          25. IF(@Name <>'')   
          26. BEGIN   
          27. SET @sql=@sql+'and  telephone ='''+@telephone +''''  
          28. END  
          29.   
          30. exec(@sql)  

                  這里面假如卡號不為空的話,那么寫出來的sql語句是這樣的:

          1. SELECT TeacherID as 教師編號,Name as 教師姓名,GradeName as 所屬年級,cardNo as 卡號,cash as 卡內(nèi)余額,realName as 管理員,OpenTime as 開卡時(shí)間,state as 狀態(tài),telephone as 聯(lián)系電話FROM view_CardDetail and  cardNo ='@cardNo’  

                 這句話顯然是錯(cuò)誤的,在查詢語句和條件的過渡的地方?jīng)]有where,而是突然來了個(gè)and。然而這個(gè)時(shí)候如果加上個(gè)必然條件那就完美了,接下來的存儲(chǔ)過程創(chuàng)建語句是這樣的:

          1. CREATE PROCEDURE [dbo].[procCardByMore]  
          2.     @cardNo varchar (50),  
          3.     @TeacherID varchar(50),   
          4.     @Name varchar(50),  
          5.     @telephone varchar(50)    
          6. AS   
          7. DECLARE @sql varchar(1000)   
          8. SET @sql='SELECT TeacherID as 教師編號,Name as 教師姓名,GradeName as 所屬年級,cardNo as 卡號,cash as 卡內(nèi)余額,realName as 管理員,OpenTime as 開卡時(shí)間,state as 狀態(tài),telephone as 聯(lián)系電話FROM view_CardDetail WHERE 1=1 '  
          9.   
          10. IF(@cardNo <>'')   
          11. BEGIN   
          12. SET @sql=@sql+'and  cardNo ='''+@cardNo+''''  
          13. END  
          14.   
          15. IF(@TeacherID <>'')   
          16. BEGIN   
          17. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
          18. END  
          19.   
          20. IF(@Name <>'')   
          21. BEGIN   
          22. SET @sql=@sql+'and  Name ='''+@Name +''''  
          23. END  
          24.   
          25. IF(@Name <>'')   
          26. BEGIN   
          27. SET @sql=@sql+'and  telephone ='''+@telephone +''''  
          28. END  
          29.   
          30. exec(@sql)  

                  這樣的話執(zhí)行出來的結(jié)果是這樣的:

          1. SELECT TeacherID as 教師編號,Nameas 教師姓名,GradeName as 所屬年級,cardNo as 卡號,cashas 卡內(nèi)余額,realName as 管理員,OpenTime as 開卡時(shí)間,stateas 狀態(tài),telephone as 聯(lián)系電話FROM view_CardDetail WHERE 1=1and  cardNo ='+@cardNo+'  

                      必然條件在這里充當(dāng)了橋梁的作用,雖然我們沒有“1=1“的需求,但是它的存在卻恰好解決了兩者互不相容的尷尬局面。

                  受上面的啟發(fā),下面的情況是這樣解決的:

                  需要根據(jù)教師編號和起始日期查詢教師的消費(fèi)記錄情況,兩個(gè)條件的存在情況各自隨便。

                  存儲(chǔ)過程代碼如下:

          1. CREATE PROCEDURE [dbo].[procConsumeByMore]   
          2.     @TeacherID varchar(50),   
          3.     @TimeStart datetime,   
          4.     @TimeEnd datetime   
          5. AS   
          6. DECLARE @sql varchar(1000)   
          7. SET @sql='SELECT TeacherID as 教師編號,Name as 教師姓名,orderID as 訂單編號,adultNum as 成人數(shù)量,childNum as 兒童數(shù)量,consumeCash as 消費(fèi)金額,consumeTime as 消費(fèi)時(shí)間,userID as 管理員編號,realName as 管理員姓名FROM view_consumeDetail WHERE 1=1 '  
          8.   
          9.   
          10. IF(@TeacherID <>'')   
          11. BEGIN   
          12. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
          13. END  
          14.   
          15. IF( @TimeStart<>null and @TimeEnd<>null)   
          16. BEGIN   
          17. SET @sql=@sql+'and  consumeTime between '''+@TimeStart +''' and '''+@TimeEnd+''''  
          18. END  
          19.   
          20. exec(@sql)  

                  這里當(dāng)@TimeStart和@TimeEnd為空的時(shí)候,空字符串不能轉(zhuǎn)換成日期類型,這時(shí)候假如兩個(gè)變量為空,我可以給他們賦一個(gè)完全的值:

          1. exec procConsumeByMore '', '1799-01-01','9999-12-29'  

                         如上面的代碼就可以選擇出所有的消費(fèi)記錄了。

                  上面兩件事情中必然事件這個(gè)配角起了不可忽視的作用,然而必然事件卻不是我們在查詢過程中需要的條件。

                  生活中配角并不意味著無趣和呆板,配角一樣可以靈動(dòng),只是它把對別人的善意放在第一位,不把張揚(yáng)作為表達(dá)自己的方式。‘上善若水,水善利萬物而不爭’,但是水又無處不在,其實(shí)就是這樣一種狀態(tài)。創(chuàng)造一個(gè)最好的配角,并不比創(chuàng)造一個(gè)主角容易。
          posted on 2012-07-17 21:29 往事隨風(fēng) 閱讀(693) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 当阳市| 子长县| 辽阳县| 炉霍县| 禄丰县| 清丰县| 涞源县| 兴安县| 承德县| 汾阳市| 桂林市| 秀山| 永和县| 桦川县| 鄢陵县| 龙山县| 武冈市| 保康县| 娄底市| 西平县| 台州市| 彭泽县| 金湖县| 铁岭县| 蒲城县| 安西县| 孝感市| 平乡县| 清苑县| 仁寿县| 铁力市| 临潭县| 河南省| 海兴县| 长葛市| 资阳市| 且末县| 饶阳县| 临海市| 东平县| 嘉峪关市|