陳印
(四川職業(yè)技術學院計科系,四川遂寧 629000)
一種在SQLServer中實現考號的批量生成算法
陳印
(四川職業(yè)技術學院計科系,四川遂寧629000)
摘要:本文以遂寧市中考管理系統(tǒng)為例,介紹了一種在SQLServer中通過存儲過程在數據庫端實現指定范圍學生考號的批量生成算法.
關鍵詞:SQLServer;存儲過程;Top;算法
考號的編排是考生管理系統(tǒng)中的重要功能模塊.在遂寧市中考管理系統(tǒng)中,每年考生人數達3-5萬人,由于考生不均衡地分布在不同區(qū)縣,所以每年中考報名結束后,都需要根據就近的原則在不同的區(qū)縣設置考點以滿足中考管理的需要.由于每年各學校參考人數均有較大變化,尤其是邊遠鄉(xiāng)鎮(zhèn),因此考點的設置每年都可能有變化,考號也就需要靈活地考慮人數、地域等多方面因素來批量生成.
考號的生成是一個大批量數據的操作,需要反復運算并更新數據庫中的數據.如果將考號的生成完全交由W E B應用程序端來處理,這個系統(tǒng)開銷的代價是很大的.SQLServer中的存儲過程為解決這一難題提供了高效的解決辦法,僅需由WEB應用程序提供少量數據,SQLServer就能在數據庫服務器端輕易實現考號的批量生成.
從遂寧市中考管理系統(tǒng)需求分析來看,考號要求設置為14位數字編碼,其中包含4位年份、4位區(qū)縣編號、2位考點號、2位考室號以及2位座位序號.原則上,同一區(qū)縣內單獨劃分考點,有1000名學生左右的學??蓡为氃O立一個考點,其他未滿足條件的學??稍诳h區(qū)或鄉(xiāng)鎮(zhèn)集中設立考點.因此,考點的設立無法簡單地由程序自動完成,必須由人工設置.當考點確立后,考生對應的考點號也就隨之確定,其完整考號的生成也就可以由完全由程序來完成.在該系統(tǒng)中,學生信息存放在students表,該表包含有學生所屬學校號schId(char(6),前4位為區(qū)縣號,后2位為學校編號)、考號applyNum(char(14),初始值Nul l).
2.1算法思想
為了給每個學生都生成一個唯一的、順序的考號,從本質上講應該是對表中記錄的逐行更新.在SQLServer中,游標是逐行操作的典型對象.不過,在SQLServer中巧妙地應用T op關鍵字同樣可以達到逐行操作的目的.那T op又將如何實現逐行的批量操作呢?
我們知道,T op可用于查詢按照某種順序排列的結果集中的前n行數據記錄.我們將需要進行考號編排的考生結果集命名為S(其考號字段值為Nul l),可以通過T op 1從S集合中獲取1行數據s對其進行考號編排,此后s?S;繼續(xù)從stu中獲取1行進行考號編排,以此往復,直到S集合為空.
2.2核心算法(T-SQL)
--@i為考室編號累增器;@exam R oom T otal為本考場最大考室號;@j為座位號累增器;@exam-R oom S eats T otal為標準考室人數;@currentExam-Num為當前運算得到的考號;@schI D s需要分配在本考場的學校號集合
按照遂寧市中考管理系統(tǒng)需求分析,可在SQLServer中創(chuàng)建存儲過程,接收考號年份、學校號、考場號和標準考室人數四個參數,按照考號編排規(guī)則自動給指定學校在分配的考場中批量生成考生考號.應用程序端僅需提供相關參數即可實現考號的批量生成.
3.1存儲過程的創(chuàng)建
3.2存儲過錯調用測試
3.3結果驗證查詢
從查詢結果可以看出,580002和580005兩個學校的學生考號均已生成,被分配到考場2013580002的不同考室中.
綜上所述,在S q l S erver中,能夠通過多重循環(huán)和T op關鍵字對數據表的多行數據逐一進行操作,從而在沒有使用游標、獨立于其他程序開發(fā)語言的前提下,實現了對考生考號的逐個批量生成.這種方法體現了數據處理的靈活性和獨立性,大大提高了數據在數據庫端處理的效率,有較大的參考和實用價值.
參考文獻:
[1]陳印.存儲過程和游標在批量生成學號中的應用[J].福建電腦,2010,(01).
[2]胡百敬、姚巧玫.SQLServer 2005數據庫開發(fā)詳解[M].北京:電子工業(yè)出版社,2006.
責任編輯:張隆輝
中圖分類號:TP311
文獻標識碼:B
文章編號:1672-2094(2013)04-0166-02
收稿日期:2013-05-18
作者簡介:陳?。?979-),男,四川渠縣人,四川職業(yè)技術學院計算機科學系講師。研究方向:計算機軟件、數據庫開發(fā)。