4. 有輸入引數和輸出引數的儲存過程
返回值其實是一種特殊的輸出引數。在大多數情況下,我們用到的是同時有輸入及輸出引數的儲存過程,比如我們想取得使用者資訊表中,某id使用者的使用者名稱,這時候,有乙個輸入引數----使用者id,和乙個輸出引數----使用者名稱。實現這一功能的儲存過程如下:
/*sp4*/
create procedure dbo.getusername
@userid int,
@username varchar(40) output
asset nocount on
begin
if @userid is null return
select @username=username
from dbo.[userinfo]
where userid=@userid
return
endgo
呼叫該儲存過程的asp**如下:
在以上**中,可以看到,與宣告返回值不同,宣告輸入引數時需要5個引數,宣告輸出引數時需要4個引數。宣告輸入引數時5個引數分別為:引數名、引數資料型別、引數型別、資料長度、引數值。宣告輸出引數時,沒有最後乙個引數:引數值。
需要特別注意的是:在宣告引數時,順序一定要與儲存過程中定義的順序相同,而且各引數的資料型別、長度也要與儲存過程中定義的相同。
如果儲存過程有多個引數,asp**會顯得繁瑣,可以使用with命令簡化**:
假如我們要取得id為1到10,10位使用者的使用者名稱,是不是要建立10次command物件呢?不是的。如果需要多次呼叫同一儲存過程,只需改變輸入引數,就會得到不同的輸出:
通過以上**可以看出:重複呼叫同一儲存過程時,只需為值發生改變的輸入引數重新賦值即可,這一方法在有多個輸入輸出引數,且每次呼叫時只有乙個輸入引數的值發生變化時,可以大大減少**量。
5. 同時具有返回值、輸入引數、輸出引數的儲存過程
前面說過,在呼叫儲存過程時,宣告引數的順序要與儲存過程中定義的順序相同。還有一點要特別注意:如果儲存過程同時具有返回值以及輸入、輸出引數,返回值要最先宣告。
為了演示這種情況下的呼叫方法,我們改善一下上面的例子。還是取得id為1的使用者的使用者名稱,但是有可能該使用者不存在(該使用者已刪除,而userid是自增長的字段)。儲存過程根據使用者存在與否,返回不同的值。此時,儲存過程和asp**如下:
6. 同時返回引數和記錄集的儲存過程
有時候,我們需要儲存過程同時返回引數和記錄集,比如在利用儲存過程分頁時,要同時返回記錄集以及資料總量等引數。以下給出乙個進行分頁處理的儲存過程:
/*sp6*/
create procedure dbo.getuserlist
@ipagecount int output, --總頁數
@ipage int, --當前頁號
@ipagesize int --每頁記錄數
asset nocount on
begin
--建立臨時表
create table #t (id int identity, --自增字段
userid int,
username varchar(40))
--向臨時表中寫入資料
insert into #t
select userid,username from dbo.[userinfo]
order by userid
--取得記錄總數
declare @irecordcount int
set @irecordcount = @@rowcount
--確定總頁數
if @irecordcount%@ipagesize=0
set @ipagecount=ceiling(@irecordcount/@ipagesize)
else
set @ipagecount=ceiling(@irecordcount/@ipagesize)+1
--若請求的頁號大於總頁數,則顯示最後一頁
if @ipage > @ipagecount
select @ipage = @ipagecount
--確定當前頁的始末記錄
declare @istart int --start record
declare @iend int --end record
select @istart = (@ipage - 1) * @ipagesize
select @iend = @istart + @ipagesize + 1
--取當前頁記錄
select * from #t where id>@istart and id<@iend
--刪除臨時表
drop table #t
--返回記錄總數
return @irecordcount
endgo
在上面的儲存過程中,輸入當前頁號及每頁記錄數,返回當前頁的記錄集,總頁數及記錄總數。為了更具典型性,將記錄總數以返回值的形式返回。以下是呼叫該儲存過程的asp**(具體的分頁操作略去):
對於以上**,只有一點需要說明:同時返回記錄集和引數時,若要取得引數,需先將記錄集關閉,使用記錄集時再將其開啟。
asp呼叫儲存過程
1.呼叫儲存過程的一般方法 先假設在sql server中有一儲存過程dt users create procedure dbo dt users as select from users return go 第一種方法是不利用command物件,直接用recordset物件 set rs serv...
asp呼叫儲存過程!
1.呼叫儲存過程的一般方法 先假設在sql server中有一儲存過程dt users create procedure dbo dt users as select from users return go 第一種方法是不利用 mand物件,直接用recordset物件 set rs server...
asp呼叫儲存過程
1.呼叫儲存過程的一般方法 先假設在sql server中有一儲存過程dt users create procedure dbo dt users asselect from users return go第一種方法是不利用command物件,直接用recordset物件 set rs server...