SQL Server目前正日益成為WindowNT操作系統上面最為重要的一種資料庫管理系統,隨著 SQL Server2000的推出,微軟的這種資料庫服務系統真正地實現了在WindowsNT/2000系列操作系統一統天下的局面,在微軟的操作系統上,沒有任何一種資料庫系統能與之抗衡,包括資料庫領域中的 ...
SQL Server目前正日益成為WindowNT操作系統上面最為重要的一種資料庫管理系統,隨著 SQL Server2000的推出,微軟的這種資料庫服務系統真正地實現了在WindowsNT/2000系列操作系統一統天下的局面,在微軟的操作系統上,沒有任何一種資料庫系統能與之抗衡,包括資料庫領域中的領頭羊甲骨文公司的看家資料庫Oracle在內。不可否認,SQL Server最大的缺陷就是只能運行在微軟自己的操作系統上,這一點是SQL Server的致命點。但在另一方面卻也成了最好的促進劑,促使SQL Server在自己僅有的“土地”上面將自己的功能發揮到了極至最大限度的利用了NT系列操作系統的各種潛能!作為SQL Server資料庫系統中很重要的一個概念就是存儲過程,合理的使用存儲過程,可以有效的提高程式的性能;並且將商業邏輯封裝在資料庫系統中的存儲過程中,可以大大提高整個軟體系統的可維護性,當你的商業邏輯發生改變的時候,不再需要修改並編譯客戶端應用程式以及重新分發他們到為數眾多的用戶手中,你只需要修改位於伺服器端的實現相應商業邏輯的存儲過程即可。合理的編寫自己需要的存儲過程,可以最大限度的利用SQL Server的各種資源。下麵我們來看看各種編寫SQL Server存儲過程和使用存儲過程的技巧經驗。 Input 此參數只用於將信息從應用程式傳輸到存儲過程。 InputOutput 此參數可將信息從應用程式傳輸到存儲過程,並將信息從存儲過程傳輸回應用程式。 Output 此參數只用於將信息從存儲過程傳輸回應用程式。 ReturnValue 此參數表示存儲過程的返回值。SQL Server 的存儲過程參數列表中不顯示該參數。它只與存儲過程的 RETURN 語句中的值相關聯。 存儲過程為主鍵生成新值後,通常使用存儲過程中的 RETURN 語句返回該值,因此用來訪問該值的參數類型是 ReturnValue 參數。 1、不帶輸入參數的簡單存儲過程 if object_id('up_user') is not null drop proc up_user go create proc up_user as set nocount on delcare @name varchar(10) begin select @name=uname from user end set nocount off go esec up_user 2、帶輸入參數的簡單存儲過程 if object_id('up_user') is not null drop proc up_user go create proc up_user @id int as set nocount on delcare @name varchar(10) begin select @name=uname from user where uid=@id end set nocount off go --執行該存儲過程 esec up_user 1 3、帶Return參數的存儲過程 if object_id('up_user') is not null drop proc up_user go create proc up_user as set nocount on delcare @age int begin select @age=uage from user return @age end set nocount off go --執行該存儲過程 declare @age int exec @age=up_user select @age 4、帶output參數的存儲過程 if object_id('up_user') is not null drop proc up_user go create proc up_user @id int, @name varchar(10) ='' output as set nocount on begin select @name=uname from user where uid=@id end set nocount off go --執行該存儲過程 declare @name varchar(10) exec up_user 2, @name output select @name 5、同時帶Return和output參數的存儲過程 if exists(select name from sysobjects where name='up_user' and type='p') drop proc up_user go create proc up_user @id int, @name varchar(20) output as declare @age int begin select @age=stuage,@name=stuname from stuinfo where uid=@id return @age end --執行該存儲過程 declare @age int declare @name varchar(20) exec @age=up_user 2,@name output select @age,@name 附:SQL Server 系統全局變數 @@CONNECTIONS 返回自上次啟動以來連接或試圖連接的次數。 @@CURSOR_ROWS 返回連接上最後打開的游標中當前存在的合格行的數量(返回被打開的游標中還未被讀取的有效數據行的行數) @@DATEFIRST 返回每周第一天的數字 @@ERROR 返回最後執行的SQL 語句的錯誤代碼。 @@FETCH_STATUS 返回被 FETCH 語句執行的最後游標的狀態,而不是任何當前被連接打開的游標的狀態。 @@IDENTITY 返回最後插入的標識值 @@LANGID 返回當前所使用語言的本地語言標識符(ID)。 @@LANGUAGE 返回當前使用的語言名。 @@LOCK_TIMEOUT 返回當前會話的當前鎖超時設置,單位為毫秒。 @@PROCID 返回當前過程的存儲過程標識符 (ID) 。 @@ROWCOUNT 返回受上一語句影響的行數。 @@SERVERNAME 返回運行 的本地伺服器名稱。 @@SPID 返回當前用戶進程的伺服器進程標識符 (ID)。 @@TRANCOUNT 返回當前連接的活動事務數。 @@VERSION 返回當前安裝的日期、版本和處理器類型。 @@CPU_BUSY 返回自SQL Server 最近一次啟動以來CPU 的工作時間其單位為毫秒 @@DATEFIRST 返回使用SET DATEFIRST 命令而被賦值的DATAFIRST 參數值SET DATEFIRST,命令用來指定每周的第一天是星期幾 @@DBTS 返回當前資料庫的時間戳值必須保證資料庫中時間戳的值是惟一的 @@ERROR 返回執行Transact-SQL 語句的錯誤代碼 @@FETCH_STATUS 返回上一次FETCH 語句的狀態值 @@IDLE 返回自SQL Server 最近一次啟動以來CPU 處於空閉狀態的時間長短單位為毫秒 @@IO_BUSY 返回自SQL Server 最近一次啟動以來CPU 執行輸入輸出操作所花費的時間其單位為毫秒 @@LANGID 返回當前所使用的語言ID 值 @@LANGUAGE 返回當前使用的語言名稱 @@LOCK_TIMEOUT 返回當前會話等待鎖的時間長短其單位為毫秒 @@MAX_CONNECTIONS 返回允許連接到SQL Server 的最大連接數目 @@MAX_PRECISION 返回decimal 和numeric 數據類型的精確度 @@NESTLEVEL 返回當前執行的存儲過程的嵌套級數初始值為0 @@OPTIONS 返回當前SET 選項的信息 @@PACK_RECEIVED 返回SQL Server 通過網路讀取的輸入包的數目 @@PACK_SENT 返回SQL Server 寫給網路的輸出包的數目 @@PACKET_ERRORS 返回網路包的錯誤數目 @@PROCID 返回當前存儲過程的ID 值 @@REMSERVER 返回遠程SQL Server 資料庫伺服器的名稱 @@SERVICENAME 返回SQL Server 正運行於哪種服務狀態之下如MSSQLServer MSDTC SQLServerAgent @@SPID 返回當前用戶處理的伺服器處理ID 值 @@TEXTSIZE 返回SET 語句的TEXTSIZE 選項值SET 語句定義了SELECT 語句中text 或image數據類型的最大長度基本單位為位元組 @@TIMETICKS 返回每一時鐘的微秒數 @@TOTAL_ERRORS 返回磁碟讀寫錯誤數目 @@TOTAL_READ 返回磁碟讀操作的數目 @@TOTAL_WRITE 返回磁碟寫操作的數目 @@TRANCOUNT 返回當前連接中處於激活狀態的事務數目