<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    pingpang

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      21 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

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

            存儲過程的優點:

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

            改善性能——已經預先編譯

            減少網絡流量——只返回最后的結果集

            重要性——針對復雜邏輯,應用已經測試號的存儲過程,不容易發生錯誤。

            安全性——如果數據庫擁有者DBO或者系統管理員SA編譯并保存了存儲結構,存儲過程就有了對它使用的數據庫對象的所有訪問權限。因此系統管理員可以向單獨的用于授予對數據對象的最小訪問權限,而不是直接允許用戶使用數據庫對象。

            這次項目開發中運用了不少的存儲過程,中間遇到了一個小問題,大家可以看看:

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

    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 卡內余額,realName as 管理員,OpenTime as 開卡時間,state as 狀態,telephone as 聯系電話 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 卡內余額,realName as 管理員,OpenTime as 開卡時間,state as 狀態,telephone as 聯系電話FROM view_CardDetail and  cardNo ='@cardNo’  

           這句話顯然是錯誤的,在查詢語句和條件的過渡的地方沒有where,而是突然來了個and。然而這個時候如果加上個必然條件那就完美了,接下來的存儲過程創建語句是這樣的:

    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 卡內余額,realName as 管理員,OpenTime as 開卡時間,state as 狀態,telephone as 聯系電話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)  

            這樣的話執行出來的結果是這樣的:

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

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

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

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

            存儲過程代碼如下:

    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 成人數量,childNum as 兒童數量,consumeCash as 消費金額,consumeTime as 消費時間,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)  

            這里當@TimeStart和@TimeEnd為空的時候,空字符串不能轉換成日期類型,這時候假如兩個變量為空,我可以給他們賦一個完全的值:

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

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

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

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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲人成网站在线观看播放| 免费在线黄色网址| 亚洲精品无码不卡| 免费福利电影在线观看| 久久91亚洲人成电影网站| 在线观看黄片免费入口不卡| 国产成人A人亚洲精品无码| 成人精品一区二区三区不卡免费看| 亚洲一区精品无码| 99免费在线观看视频| 亚洲国产成人精品无码一区二区| 59pao成国产成视频永久免费 | 一级一看免费完整版毛片| 亚洲综合色成在线播放| 国产免费网站看v片在线| 亚洲自偷自拍另类图片二区| 国产精品免费观看久久| 久久久久亚洲AV无码去区首| 亚洲另类激情专区小说图片| 国产一级淫片a免费播放口| 中文字幕亚洲精品资源网| 好男人视频在线观看免费看片 | 好猛好深好爽好硬免费视频| 亚洲va中文字幕无码久久| 中文字幕免费视频| 久久夜色精品国产噜噜亚洲a| 亚洲福利在线播放| 免费人妻无码不卡中文字幕系| 亚洲一区二区三区高清视频| 免费人成在线观看网站视频| 黄页免费在线观看 | 国产免费久久久久久无码| 亚洲国产一区二区a毛片| 无码人妻久久一区二区三区免费丨 | 久久精品国产大片免费观看| 亚洲一卡一卡二新区无人区| 国产亚洲精品福利在线无卡一| 国产精品永久免费10000| xxxxx做受大片在线观看免费| 亚洲精品国产第1页| 亚洲男人天堂2020|