SQL Server存儲過程Return、output參數及使用技巧

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 參數。 
 
一、不帶輸入參數的簡單存儲過程
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
 
二、帶輸入參數的簡單存儲過程
 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
 
三、帶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
 
四、帶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
 
五、同時帶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
返回當前鏈接中處於激活狀態的事務數目
相關文章
相關標籤/搜索