SQL Server儲存過程Return、output引數及使用技巧
阿新 • • 發佈:2019-01-01
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 [email protected]
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 [email protected]
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 [email protected]
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
返回當前連線中處於啟用狀態的事務數目