何代其
摘要:在大數(shù)據(jù)肆虐的今天,數(shù)據(jù)正在迅速膨脹并變大,已經(jīng)滲透到每一個(gè)行業(yè)和業(yè)務(wù)職能領(lǐng)域,成為重要的生產(chǎn)因素,它決定著企業(yè)的未來(lái)發(fā)展,雖然很多企業(yè)可能并沒(méi)有意識(shí)到數(shù)據(jù)爆炸性增長(zhǎng)帶來(lái)問(wèn)題的隱患,但是隨著時(shí)間的推移,人們將越來(lái)越多的意識(shí)到數(shù)據(jù)對(duì)企業(yè)的重要性。
關(guān)鍵詞:探討;自定義;SQL語(yǔ)句;應(yīng)用
信息化越好的企業(yè),對(duì)數(shù)據(jù)會(huì)越來(lái)越重視,如何從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù),最常見(jiàn)的方法莫過(guò)于使用簡(jiǎn)單的DELETE、INSERT、SELECT、UPDATE等標(biāo)準(zhǔn)SQL語(yǔ)句,要不就是技術(shù)尖端的存儲(chǔ)過(guò)程,但這兩種方法很有局限性。事實(shí)上介于標(biāo)準(zhǔn)SQL語(yǔ)句和存儲(chǔ)過(guò)程之間的自定義SQL語(yǔ)句更靈活,更方便。
一、使用標(biāo)準(zhǔn)SQL語(yǔ)句
標(biāo)準(zhǔn)的SQL語(yǔ)句使用方法很簡(jiǎn)單,如:SelectCommand="SELECT * FROM [manger] where ID<>1" SelectCommandType="Text",由于標(biāo)準(zhǔn)的SQL語(yǔ)句是默認(rèn)值,所以一般把SelectCommandType="Text"省略。
二、使用存儲(chǔ)過(guò)程
盡管存儲(chǔ)過(guò)程功能強(qiáng)大,但使用卻很簡(jiǎn)單,比如:
SelectCommand="xytotal" SelectCommandType="StoredProcedure">
PropertyName="SelectedValue" Type="String" />
其中xytotal是存儲(chǔ)過(guò)程名,nf是參數(shù)。
三、使用自定義SQL語(yǔ)句
1.使用CAST函數(shù)構(gòu)造數(shù)據(jù)類(lèi)型
在工資查詢(xún)時(shí),可選擇起止年月,但數(shù)據(jù)庫(kù)沒(méi)有年、月數(shù)據(jù)類(lèi)型,只有日期類(lèi)型,一般用每月的1日表示該月,因此要用年、月和“-1”日進(jìn)行構(gòu)造,即cast(@年+'-'+@月+'-1' as datetime),由此構(gòu)成Where條件。如:SelectCommand="SELECT [應(yīng)發(fā)合計(jì)],[代扣合計(jì)],[實(shí)發(fā)金額],……,[月份] FROM [simplelist] WHERE 月份>= cast(@起年+'-'+@起月+'-1' as datetime)and 月份<= cast(@止年+'-'+@止月+'-1' as datetime)"
2.使用CASE WHEN THEN ELSE END選擇字段
SQL命令中的case...when...then...else...end條件查詢(xún)不同于where,case...when...then...else...end在from前面,可以改變記錄中某字段的值,不能決定是否顯示該記錄;而where在from后面,不可以改變記錄中某字段的值,但可以決定是否顯示該記錄。簡(jiǎn)單地說(shuō),case是垂直篩選字段,而where是水平篩選記錄,如SelectCommand="SELECT 學(xué)院,CASE 省名 WHEN '合計(jì)' THEN 省名 ELSE 省區(qū)市 END AS 地區(qū),人數(shù) FROM totalview"。
3.使用if else 選擇SELECT語(yǔ)句
在就業(yè)管理系統(tǒng)中,在班級(jí)列表中,有具體班級(jí)和全部?jī)煞N情形的選項(xiàng),導(dǎo)致where條件也不同,又不能用case進(jìn)行構(gòu)造,可使用if else 進(jìn)行選擇,具體構(gòu)成如下:SelectCommand="if(@班級(jí)<>'全部')SELECT [姓名],[就業(yè)單位],[聯(lián)系電話],…… FROM [out] WHERE([班級(jí)] = @班級(jí))else SELECT [姓名],[就業(yè)單位],[聯(lián)系電話],…… FROM [out] WHERE(substring(畢業(yè)時(shí)間,1,4)= @畢業(yè)時(shí)間)AND([學(xué)院] = @學(xué)院)"。
這種情形多數(shù)開(kāi)發(fā)人員一般采用存儲(chǔ)過(guò)程,并且表面上更簡(jiǎn)單,但本質(zhì)是相同的,不過(guò)表達(dá)有所不同,因此各有各的用途。
4.構(gòu)造UPDATE語(yǔ)句
不同情形更新的字段不同,照說(shuō)可以用存儲(chǔ)過(guò)程來(lái)完成,但一般情況下,UPDATE字段都好幾個(gè)字段,甚至幾十個(gè)字段,那么使用存儲(chǔ)過(guò)程幾乎不可能了,這時(shí)不得不用if else進(jìn)行構(gòu)造,這就是幾乎沒(méi)有UPDATE的存儲(chǔ)過(guò)程原因。如UpdateCommand="if(@就業(yè)去向='自由職業(yè)')UPDATE [out] SET ……,[自由工作所在地] = @自由工作所在地,[自由職業(yè)內(nèi)容] = @自由職業(yè)內(nèi)容,[自由職業(yè)本人聲明] = @自由職業(yè)本人聲明 WHERE [ID] = @ID else if(@就業(yè)去向='升學(xué)')UPDATE [out] SET ……,[升學(xué)名稱(chēng)] = @升學(xué)名稱(chēng) WHERE [ID] = @ID else if(@就業(yè)去向='參軍入伍')UPDATE [out] SET ……,[部隊(duì)名稱(chēng)] = @部隊(duì)名稱(chēng) WHERE [ID] = @ID"。
嚴(yán)格地說(shuō),所有的存儲(chǔ)過(guò)程都可以用SQL語(yǔ)句完成,反過(guò)來(lái),所有的SQL語(yǔ)句也都可以用存儲(chǔ)過(guò)程(視圖)來(lái)表示,那么究竟什么時(shí)候用存儲(chǔ)過(guò)程?什么時(shí)候用SQL語(yǔ)句?一般來(lái)說(shuō),簡(jiǎn)單的查詢(xún)用SQL語(yǔ)句,復(fù)雜且參數(shù)少的查詢(xún)用存儲(chǔ)過(guò)程,參數(shù)多、較復(fù)雜的查詢(xún)只能由自定義SQL語(yǔ)句完成,或者說(shuō)越簡(jiǎn)單就用SQL語(yǔ)句,越復(fù)雜就用存儲(chǔ)過(guò)程,介于兩者之間就用自定義SQL語(yǔ)句,它們之間沒(méi)有絕對(duì)的界限。
參考文獻(xiàn):
[1]姚永一,SQL Server數(shù)據(jù)庫(kù)實(shí)用教程,北京:電子工業(yè)出版社,2010.
[2]高云,SQL Server 2008數(shù)據(jù)庫(kù)技術(shù)實(shí)用教程,北京:清華大學(xué)出版社,2011
[3]何玉潔,數(shù)據(jù)庫(kù)原理與應(yīng)用(第二版),北京:機(jī)械工業(yè)出版社,2011
[4]壯志劍,數(shù)據(jù)庫(kù)原理與SQL Server,北京:高等教育出版社,2008