SQLServer存儲(chǔ)過(guò)程編程經(jīng)驗(yàn)技巧
時(shí)間:2008-11-15 20:24:00 來(lái)源:無(wú)憂考網(wǎng) [字體:小 中 大]下面我們討論的前提都是您有過(guò)一定的SQLServer存儲(chǔ)過(guò)程的編寫(xiě)經(jīng)驗(yàn),下面的各種技巧如果沒(méi)有特別注明,則同時(shí)適用于SQLServer7.0和SQLServer2000。
。薄⑹褂茫希眨裕校眨灶愋蛥(shù)的存儲(chǔ)過(guò)程的技巧
一般的存儲(chǔ)過(guò)程都是直接返回一段記錄集給調(diào)用者,但是有的時(shí)候我們只需要一些存儲(chǔ)過(guò)程返回的一些參數(shù)的值,這時(shí)候可以指定存儲(chǔ)過(guò)程的OUTPUT參數(shù),比如:
Create。穑颍铮悖澹洌酰颍濉。牵澹簦危幔恚濉
。溃酰椋洹。睿觯幔颍悖瑁幔颍ǎ保,
@usernam。睿觯幔颍悖瑁幔颍ǎ保埃剑ВА。铮酰簦穑酰
AS
。螅澹簟。溃酰螅澹颍睿幔恚澹剑В瑁铮睿纾悖瑁幔铮
。牵
在上面的存儲(chǔ)過(guò)程當(dāng)中我們傳遞進(jìn)的參數(shù)是@uid,而參數(shù)@username則在調(diào)有的時(shí)候不需要傳遞進(jìn)去。這樣,存儲(chǔ)過(guò)程會(huì)返回給我們參數(shù)@username的值是‘hongchao’。上面的都比較的容易,需要注意的是,當(dāng)在SQL2000中的時(shí)候,如果你的存儲(chǔ)過(guò)程只有一個(gè)參數(shù),并且這個(gè)參數(shù)是OUTPUT類型的,你必須在調(diào)用這個(gè)存儲(chǔ)過(guò)程的時(shí)候給這個(gè)參數(shù)一個(gè)初始的值,否則會(huì)出現(xiàn)調(diào)用錯(cuò)誤的情況!
。病⒃诖鎯(chǔ)過(guò)程中的書(shū)寫(xiě)注意事項(xiàng)
這一點(diǎn)在SQLServer7.0和SQLServer2000中有些地方是不一樣的,也不
知道是不是微軟的遺漏,那就是有些系統(tǒng)的關(guān)鍵字在不同的版本之間有所不同,比如關(guān)鍵字level,同樣的一句話:
select。。妫颍铮怼。酰螅澹颍蟆。鳎瑁澹颍濉。欤澹觯澹欤剑
在SQLServer7當(dāng)中的存儲(chǔ)過(guò)程當(dāng)中運(yùn)行沒(méi)有絲毫的問(wèn)題,但是到了SQLServer2000當(dāng)中則會(huì)出現(xiàn)運(yùn)行的錯(cuò)誤,原因就是在于在SQLServer2000中“level”被當(dāng)作了關(guān)鍵字(奇怪的是SQL7當(dāng)中也同樣是關(guān)鍵字,卻沒(méi)問(wèn)題),所以在SQL2000當(dāng)中,上面的語(yǔ)句應(yīng)當(dāng)改為:
select。。妫颍铮怼。酰螅澹颍蟆。鳎瑁澹颍濉。郏欤澹觯澹欤荩剑
從上面的例子中我們可以看到,在你編寫(xiě)存儲(chǔ)過(guò)程的時(shí)候,在有可能和系統(tǒng)關(guān)鍵字的地方使用“[”和“]”將他包圍起來(lái),以避免在移植過(guò)程中出現(xiàn)的運(yùn)行錯(cuò)誤問(wèn)題。
3、在存儲(chǔ)過(guò)程中使用系統(tǒng)存儲(chǔ)過(guò)程SP_Executesql的注意事項(xiàng)
我們?cè)诰帉?xiě)自己的存儲(chǔ)過(guò)程的時(shí)候,往往在很多的情況下,會(huì)使用到系統(tǒng)的存儲(chǔ)過(guò)程SP_Execute。但是需要的注意的是,如果你在這個(gè)存儲(chǔ)過(guò)程的參數(shù)(一般是一段SQL語(yǔ)句)當(dāng)中進(jìn)行了臨時(shí)Table的操作,那末對(duì)于調(diào)用者來(lái)說(shuō),這個(gè)臨時(shí)Table是不可見(jiàn)的,也就是說(shuō)你無(wú)法通過(guò)臨時(shí)Table來(lái)在調(diào)用者和被調(diào)用者之間傳遞值。解決的方法是使用全局臨時(shí)Table,也就是“#!遍_(kāi)頭的Table。
。、在存儲(chǔ)過(guò)程中使用臨時(shí)Table和游標(biāo)的注意事項(xiàng)
如果我們的商業(yè)邏輯比較復(fù)雜,在存儲(chǔ)過(guò)程當(dāng)中,就需要一些媒介作為中轉(zhuǎn)臺(tái),這時(shí)候臨時(shí)表j就發(fā)揮了作用,但是請(qǐng)務(wù)必記得在使用完之后,即時(shí)刪除使用到的臨時(shí)Table。
而在存儲(chǔ)過(guò)程當(dāng)中想要依次遍歷一個(gè)記錄集的方法就是使用系統(tǒng)游標(biāo),同樣要注意的是,在使用完成之后及時(shí)關(guān)閉和銷毀游標(biāo)對(duì)象釋放他用到的資源。并且不在萬(wàn)不得已的情況下,不要隨意使用游標(biāo),因?yàn)樗麜?huì)占用較多的系統(tǒng)資源,尤其是對(duì)于大并發(fā)量的情況下,很容易使得系統(tǒng)資源耗盡而崩潰。
使用臨時(shí)Table和游標(biāo)各有利弊,在使用的過(guò)程中要適當(dāng)?shù)睦眉纯桑?