SQL Server存儲過程編程經驗技巧

MS SQL Server目前正日益成爲WindowNT操作系統上面最爲重要的一種數據庫管理系統,隨着
MS SQL Server2000的推出,微軟的這種數據庫服務系統真正的實現了在WindowsNT/200
0系列操作系統一統天下的局面,在微軟的操作系統上面,沒有任何一種數據庫系統能與之相抗衡,包括數據庫領域的領
頭羊甲骨文公司的看家數據庫系統Oracle在內。不可否認,MS SQL Server最大的缺陷就是隻能運行
在微軟自己的操作系統上面,這一點是MS SQL Server的致命傷口。但在另一方面卻也成了最好的促進劑,
促使MS SQL Server在自己僅有的土地上面將自己的功能發揮到了極至,最大限度的利用了Windo
wsNT系列操作系統的各種潛能!作爲MS SQL Server數據庫系統中很重要的一個概念就是存儲過程,合
理的使用存儲過程,可以有效的提高程序的性能;並且將商業邏輯封裝在數據庫系統中的存儲過程中,可以大大提高整個
軟件系統的可維護性,當你的商業邏輯發生了改變的時候,不再需要修改並編譯客戶端應用程序以及重新分發他們到爲數
衆多的用戶手中,你只需要修改位於服務器端的實現相應商業邏輯的存儲過程即可。合理的編寫自己需要的存儲過程,可
以最大限度的利用MS SQL Server的各種資源。下面我們來共同看看各種編寫MS SQL Server
存儲過程和使用存儲過程的技巧經驗! 

  下面我們討論的前提都是您有過一定的MS SQL Server存儲過程的編寫經驗,下面的各種技巧如果沒有
特別註明,則同時適用於MS SQL Server7.0和MS SQL Server2000。 

  1、使用OUTPUT類型參數的存儲過程的技巧 

一般的存儲過程都是直接返回一段記錄集給調用者,但是有的時候我們只需要一些存儲過程返回的一些參數的值,這時候
可以指定存儲過程的OUTPUT參數,比如: 

  Create procedure GetName  

  @uid nvarchar(1), 

  @usernam nvarchar(10)='' output 

  AS 

  set @username='hongchao' 

  GO 

  在上面的存儲過程當中我們傳遞進的參數是@uid,而參數@username則在調有的時候不需要傳遞進去。
這樣,存儲過程會返回給我們參數@username的值是‘hongchao’。上面的都比較的容易,需要注意的
是,當在SQL2000中的時候,如果你的存儲過程只有一個參數,並且這個參數是OUTPUT類型的,你必須在調
用這個存儲過程的時候給這個參數一個初始的值,否則會出現調用錯誤的情況! 

  2、在存儲過程中的書寫注意事項 

  這一點在MS SQL Server7.0和MS SQL Server2000種有些地方是不一樣的,也不
知道是不是微軟的遺漏,那就是有些系統的關鍵字在不同的版本之間有所不同,比如關鍵字level,同樣的一句話: 

select * from users where level=1 

在MS SQL Server7當中的存儲過程當中運行沒有絲毫的問題,但是到了MS SQL Server20
00當中則會出現運行的錯誤,原因就是在於在MS SQL Server2000中level被當作了關鍵字
(奇怪的是SQL7當中也同樣是關鍵字,卻沒問題),所以在SQL2000當中,上面的語句應當改爲: 

select * from users where [level]=1 

從上面的例子中我們可以看到,在你編寫存儲過程的時候,最好在有可能和系統關鍵字的地方使用將他包
圍起來,以避免在移植過程中出現的運行錯誤問題。 

  3、在存儲過程中使用系統存儲過程SP_Executesql的注意事項 

  我們在編寫自己的存儲過程的時候,往往在很多的情況下,會使用到系統的存儲過程SP_Execute。但是需
要的注意的是,如果你在這個存儲過程的參數(一般是一段SQL語句)當中進行了臨時Table的操作,那末對於調
用者來說,這個臨時Table是不可見的,也就是說你無法通過臨時Table來在調用者和被調用者之間傳遞值。解
決的方法是使用全局臨時Table,也就是##開頭的Table。 

  4、在存儲過程中使用臨時Table和遊標的注意事項 

  如果我們的商業邏輯比較複雜,在存儲過程當中,就需要一些媒介作爲中轉檯,這時候臨時表舅發揮了作用,但是請
務必記得在使用完之後,即使刪除使用到的臨時Table。 

  而在存儲過程當中想要依次遍歷一個記錄集的唯一方法就是使用系統遊標,同樣要注意的是,在使用完成之後及時關
閉和銷燬遊標對象釋放他用到的資源。並且不在萬不得已的情況下,不要隨意使用遊標,因爲他會佔用較多的系統資源,
尤其是對於大併發量的情況下,很容易使得系統資源耗盡而崩潰。 

  使用臨時Table和遊標各有利弊,在使用的過程中要適當的利用即可! 

  5、在存儲過程中調用外部的ActiveX DLL程序 

  有些特殊的情況下,我們可能會需要調用外部的ActiveX DLL程序,這個時候就需要使用到系統的存儲過
程sp_OACreate以及其他的相關係統存儲過程,都是以sp_OA開頭的存儲過程,可以自由的在自己的存儲
過程當中調用ActiveX DLL的各種方法和屬性。比如下面的例子: 

  DECLARE @object int 

  DECLARE @hr int 

  DECLARE @property varchar(255) 

  DECLARE @return varchar(255) 

  DECLARE @src varchar(255), @desc varchar(255) 

  -- 建立一個對象(SQLDMO.SQLServer). 

  EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object 
OUT 

  IF @hr <> 0 

  BEGIN 

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT  

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc 

      RETURN 

  END 

  -- 設置對象的屬性. 

  EXEC @hr = sp_OASetProperty @object, 'HostName', 'G
izmo' 

  IF @hr <> 0 

  BEGIN 

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT  

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc 

      RETURN 

  END 

  -- 通過OUTPUT參數獲取對象的屬性值. 

  EXEC @hr = sp_OAGetProperty @object, 'HostName', @p
roperty OUT 

  IF @hr <> 0 

  BEGIN 

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT  

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc 

      RETURN 

  END 

  PRINT @property 

  -- 調用對象的方法 

  EXEC @hr = sp_OAMethod @object, 'Connect', NULL, 'm
y_server', 'my_login', 'my_password' 

  IF @hr <> 0 

  BEGIN 

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT  

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc 

      RETURN 

  END 

  -- 銷燬已經創建的ActiveX對象 

  EXEC @hr = sp_OADestroy @object 

  IF @hr <> 0 

  BEGIN 

     EXEC sp_OAGetErrorInfo @object, @src OUT, @desc 
OUT  

     SELECT hr=convert(varbinary(4),@hr), Source=@sr
c, Description=@desc 

      RETURN 

  END 

  6、在存儲過程中使用數據庫事務處理 

  在很多的情況下,我們在存儲過程中都會遇到需要同時操作多個表的情況,這時候就需要避免在操作的過程中由於以
外而造成的數據的不一致性。這時候就需要將操作多個表的操作放入到事務中進行處理。 

  但是需要注意的是,不能在事務中使用return語句強行退出,這樣會引發事務的非正常錯誤,不能保證數據的一致
性。 

  並且,一旦將多個處理放入事務當中,系統的處理速度會有所降低,所以應當將頻繁操作的多個可分割的處理過程放
入到多個存儲過程當中,這樣會大大提高系統的響應速度,但是前提是不違背數據的一致性。 

  看完了上面的這些編寫SQL Server存儲過程當中的技巧,相信對您或多或少會有些幫助,也希望通過上面的一些經驗
總結,可以使得您在應用SQL Server存儲過程的時候,有意識的可以避免一些彎路。 

  (以上所有程序在Windows Advance Server2000中文版+MS SQL Server7.0/2000中文版測試通過)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章