熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

查詢參數提高SQL語句的利用率

2013-11-13 12:41:12  來源: SQL語言 

  有時候數據庫管理員在查詢記錄的時候有可能只是查詢條件不同而其他的內容都是相同的如人事部門可能每天都需要查詢當天礦工遲到早退的員工然後向人事經理匯報其實這個時候SQL語句的大部分都是相同的只是查詢條件中一個時間不一樣而已遇到這種情況時數據庫管理員需要創建可以使用多次但每次使用不同值的查詢在SQLServer數據庫中把這種情況叫做參數查詢

   在什麼時候使用參數符號

  在SQLServer數據庫中其提供的語言支持使用參數來作為查詢條件如果用戶需要創建每次使用不同值的查詢則可以在查詢中使用參數那麼這個參數到底是什麼呢?其實確切的說應該把這個參數叫做占位符即參數是在運行查詢時提供值的占位符在SQLServer數據庫中在需要顯示的內容(Select子句)與查詢條件(Where子句)中都可以采用參數從其他地方接收輸入的值不過大部分情況下都只在查詢條件中使用參數即在單個行或者組的搜索條件中使用參數作為占位符

  不過並不是說只有在搜索條件中才能夠使用參數只是說在搜索中參數使用的比較多而已另外有時候在表達式中可能也會用的比較多如一個ERP系統中可能會有一定的價格折扣%的折扣那麼在應用程序設計的時候就需要把這個折扣率從前台傳遞到後台的SQL語句中然後數據庫系統根據這個折扣率把計算後的架構回傳給前台的客戶端在這個過程中如果能夠采用參數來實現的話就可以提高SQL語句的利用率不用每次使用不同的折扣率而采用不同的SQL語句

  所以說參數在SQLServer中的應用范圍是非常廣泛的通常情況下在SQL語句的任何部分都可以采用參數來接受外部傳入的值從而避免每次參數不同而調整SQL語句的情況

  二 未命名參數與命名參數

  在SQLServer中參數可以分為兩種即未命名參數與命名參數通常情況下如果SQL語句中只需要一個參數的話那麼可以采用未命名參數如需要查詢某個員工上班到現在的全部出勤信息此時就只需要用到員工編號這個參數即可此時可以采用未命名的參數不過有的時候可能查詢時需要不止一個參數如現在需要查詢某個員工在月份的出勤情況此時就需要兩個參數分別為員工編號月份或者需要三個參數分別為員工編號開始日期結束日期等等總之要多於一個參數此時就需要使用命名參數因為如果使用未命名參數的話則數據庫並不知道要把哪個參數對應到哪個地方所以說如果要在查詢中使用多個參數那麼此時命名參數就會非常有用

  未命名的參數使用很簡單不需要像應用程序開發那樣先聲明再使用而是在需要的地方直接輸入?符號即可如需要把某個員工最為參數的話則可以使用ad_user_id =?即可這裡需要注意一點這裡不需要加入單引號因為正常情況下如果輸入的條件是字符型的話則必須利用單引號括起來如果輸入的條件是數字的話則不用單引號但是如果采用的是參數的話無論最終輸入的數據類型是什麼這裡都不用單引號否則的話就不能夠達到預期的效果

  如果采用的是命名參數的話也不需要事先定義只需要在使用的時候定義參數名字即可這個定義的過程也很簡單如現在用戶需要按員工編號與日期來查詢某個員工的出勤記錄此時只需要使用AD_USER_ID=%USER_ID% AND USERDATE=%USERSDATE%從這裡可以看出未命名參數與命名參數使用的參數符號是不同的在命名參數是需要中參數名字的前後使用%號表示這是一個命名參數不過這個前綴與後綴的字符數據庫管理員可以根據自己的需要來進行自定義不過需要注意的就是在創建命名參數查詢之前必須要先預先定義後這個參數的前綴與後綴符號

  三 在循環中使用參數標記

  參數不僅可以用在Select查詢語句中有時候在一些循環語句中也可以使用如現在有一個股票分析系統用戶自定義了只關注的股票現在這個系統要每隔秒就從數據庫系統中讀取這十只股票的最新價格此時該如何實現呢?

  當然用戶也可以在查詢條件語句中通過輸入個股票的代碼來實現查詢但是這個做非常的麻煩而且由於用戶關注的股票數量不確定所以采用多個命名參數來實現的話也不現實雖然SQL語句可以接受多個參數但是其參數的數量必須是固定的像現在這種不固定的參數SQL語句也很難實現針對這種情況只有通過循環語句來實現即在SQL語句中只使用一個參數即股票代碼這個參數然後通過循環語句把用戶選定的股票代碼一個一個的傳遞進去傳進去第一個後數據庫返回結果;然後再傳進去第二個再返回結果知道最後一個參數傳遞完畢通常情況下可以把這個循環語句做成一個存儲過程或者函數然後通過參數的個數來控制循環的次數這種解決方案可以很好的實現因為參數個數不確定而難以處理的情況當然這其中仍然參數在起著主導作用

  四 在SET語句中使用參數

  企業有時候可能遇到這種需求即把滿足某個條件的記錄中某些字段利用某個參數值來進行代替如企業可能經濟效益好要把提升員工的工資其中普通員工提升%管理層員工提升%此時就需要用到SQL語句中的Update語句這更新的時候需要用到兩個參數一個是員工的類別即是屬於普通員工又或者是屬於管理層員工;第二個參數是提升的百分比是提升%還是%

  其實在實際工作中有很多地方需要用到類似地參數與語句如在ERP系統中有時候需要根據產品的類別或者供應商來更新價格;如有時候需要把好幾年都沒有用過的產品信息設置為不活躍;有時候需要把訂單尾數少於的采購訂單指定為結束等等所有數據庫管理員必須要掌握這種參數與Upadate語句結合使用的案例這有助於數據庫管理員在日後的工作中利用這些語句順利完成任務

  五 使用參數時的注意事項

  從上面分析中可以看出使用參數與不使用參數有一個很大的區別如果直接在SQL語句中輸入查詢條件(不通過參數來實現)那麼數據庫在編譯SQL語句的時候會進行語法方面的檢查如果輸入的條件有錯誤或者其數據類型跟需要比較字段的數據類型不一致或者在SET語句中需要更新的值與數據庫字段的數據類型不一致的話那麼數據庫就會提示錯誤信息也就是說在執行語句之前就對了一道保障

  但是如果使用參數來傳遞數據的話有一個不好的信息即在SQL語句執行時傳遞的參數是否符合要求呢?此時對數據庫來說只有在SQL語句執行的時候才能夠知道為了避免這種情況最好能夠在應用程序那邊進行相關的判斷與限制如需要查詢今天是否有員工曠工遲到早退等等情況一共需要兩個參數一是時間二是事由(可以多選)但是這兩個數據又都是比較特別的如時間是一個日期類型的數據如果在應用程序客戶端用戶不小心輸入了一個不是日期類型的數據或者把日寫成了這很可能是筆誤但這畢竟是錯誤數據庫無法識別類似的錯誤為此最好能夠在應用程序客戶端處就進行檢查如果發現這個輸入的日期非法的話就在客戶端把這個參數傳遞給數據庫之前就提示參數輸入錯誤

  另外事由這個字段應該是跟列表類似的數據類型在數據庫中只保存著對應的幾個編碼也就是說其輸入的是有一定含義的序列對於這種數據在客戶端上也需要進行控制其實控制起來也很簡單即不要讓用戶自己手工輸入而是通過復選框的形式來用戶來進行選擇然後應用程序直接根據選擇的內容翻譯成對應的參數然後傳遞給數據庫中的SQL語句顯然在應用程序客戶端層面可以對參數的合法性進行控制最大限度的保障輸入的數據符合SQL語句的要求避免因為數據類型不一致而導致SQL語句執行錯誤所以在SQLServer數據庫使用參數的話數據庫管理員還需要跟程序開發者好好溝通才能夠讓參數發揮其應有的作用


From:http://tw.wingwit.com/Article/program/SQL/201311/16381.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.