儲存過程就是作為可執行物件存放在資料庫
中的乙個或多個sql命令。
定義總是很抽象。
儲存過程其實就是能完成一定操作的一組sql語句,只不過這組語句是放在資料庫
中的(這裡我們只談sql server)。
如果我們通過建立儲存過程以及在asp中呼叫儲存過程,就可以避免將sql語句同asp**混雜在一起。
這樣做的好處至少有三個:
第一、大大提高效率。
儲存過程本身的執行速度非常快,而且,呼叫儲存過程可以大大減少同資料庫
的互動次數。
第二、提高安全性。
假如將sql語句混合在asp**中,一旦**失密,同時也就意味著庫結構失密。
第三、有利於sql語句的重用。
在asp中,一般通過command物件呼叫儲存過程,根據不同情況,本文也介紹其它呼叫方法。
為了方便說明,根據儲存過程的輸入輸出,作以下簡單分類:
1. 只返回單一記錄集的儲存過程
假設有以下儲存過程(本文的目的不在於講述t-sql語法,所以儲存過程只給出**,不作說明):
/*sp1*/
create procedure dbo.getuserlist
asset nocount on
begin
select * from dbo.[userinfo]
endgo
以上儲存過程取得userinfo表中的所有記錄,返回乙個記錄集。
通過command物件呼叫該儲存過程的asp**如下:
'**通過command物件呼叫儲存過程**
dim mycomm,myrst
set mycomm = server.createobject("adodb.command")
mycomm.activeconnection = myconstr 'myconstr是資料庫
連線字串
mycomm.commandtext = "getuserlist" '指定儲存過程名
mycomm.commandtype = 4 '表明這是乙個儲存過程
mycomm.prepared = true '要求將sql命令先行編譯
set myrst = mycomm.execute
set mycomm = nothing
儲存過程取得的記錄集賦給myrst,接下來,可以對myrst進行操作。
在以上**中,commandtype屬性表明請求的型別,取值及說明如下:
-1 表明commandtext引數的型別無法確定
1 表明commandtext是一般的命令型別
2 表明commandtext引數是乙個存在的表名稱
4 表明commandtext引數是乙個儲存過程的名稱
還可以通過connection物件或recordset物件呼叫儲存過程,方法分別如下:
'**通過connection物件呼叫儲存過程**
dim myconn,myrst
set myconn = server.createobject("adodb.connection")
myconn.open myconstr 'myconstr是資料庫
連線字串
set myrst = myconn.execute("getuserlist",0,4) '最後乙個參斷含義同commandtype
set myconn = nothing
'**通過recordset物件呼叫儲存過程**
dim myrst
set myrst = server.createobject("adodb.recordset")
myrst.open "getuserlist",myconstr,0,1,4
'myconstr是資料庫
連線字串,最後乙個參斷含義與commandtype相同
2. 沒有輸入輸出的儲存過程
請看以下儲存過程:
/*sp2*/
create procedure dbo.deluserall
asset nocount on
begin
delete from dbo.[userinfo]
endgo
該儲存過程刪去userinfo表中的所有記錄,沒有任何輸入及輸出,呼叫方法與上面講過的基本相同,只是不用取得記錄集:
'**通過command物件呼叫儲存過程**
dim mycomm
set mycomm = server.createobject("adodb.command")
mycomm.activeconnection = myconstr 'myconstr是資料庫
連線字串
mycomm.commandtext = "deluserall" '指定儲存過程名
mycomm.commandtype = 4 '表明這是乙個儲存過程
mycomm.prepared = true '要求將sql命令先行編譯
mycomm.execute '此處不必再取得記錄集
set mycomm = nothing
當然也可通過connection物件或recordset物件呼叫此類儲存過程,不過建立recordset物件是為了取得記錄集,在沒有返回記錄集的情況下,還是利用command物件吧。
3. 有返回值的儲存過程
在進行類似sp2的操作時,應充分利用sql server強大的事務處理功能,以維護資料的一致性。
並且,我們可能需要儲存過程返回執**況,為此,將sp2修改如下:
/*sp3*/
create procedure dbo.deluserall
asset nocount on
begin
begin transaction
delete from dbo.[userinfo]
if @@error=0
begin
commit transaction
return 1
endelse
begin
rollback transaction
return 0
end
return
endgo
以上儲存過程,在delete順利執行時,返回1,否則返回0,並進行回滾操作。
為了在asp中取得返回值,需要利用parameters集合來宣告引數:
'**呼叫帶有返回值的儲存過程並取得返回值**
dim mycomm,mypara
set mycomm = server.createobject("adodb.command")
mycomm.activeconnection = myconstr 'myconstr是資料庫
連線字串
mycomm.commandtext = "deluserall" '指定儲存過程名
mycomm.commandtype = 4 '表明這是乙個儲存過程
mycomm.prepared = true '要求將sql命令先行編譯
'宣告返回值
set mypara = mycomm.createparameter("return",2,4)
引數名可以任意設定,但一般應與儲存過程中宣告的引數名相同。
此處是返回值,我習慣上設為"reture";
第二個引數(2),表明該引數的資料型別,具體的型別**請參閱ado參考,以下給出常用的型別**:
adbigint: 20 ;
adbinary : 128 ;
adboolean: 11 ;
adchar: 129 ;
addbtimestamp: 135 ;
adempty: 0 ;
adinteger: 3 ;
adsmallint: 2 ;
adtinyint: 16 ;
advarchar: 200 ;
對於返回值,只能取整形,且-1到-99為保留值;
第三個引數(4),表明引數的性質,此處4表明這是乙個返回值。
此引數取值的說明如下:
0 : 型別無法確定; 1: 輸入引數;2: 輸入引數;3:輸入或輸出引數;4: 返回值
以上給出的asp**,應該說是完整的**,也即最複雜的**,其實
甚至還可以繼續簡化,稍後會做說明。
對於帶引數的儲存過程,只能使用command物件呼叫(也有資料說可通過connection物件或recordset物件呼叫,但我沒有試成過)。
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]
sql server儲存過程語法
變數的宣告,sql裡面宣告變數時必須在變數前加 符號 declare i int 變數的賦值,變數賦值時變數前必須加set set i 30 宣告多個變數 declare s varchar 10 a int sql 裡if語句 if 條件 begin 執行語句 endelse begin 執行語句...
sql server儲存過程
建立表的語句 create table student sno int primary key,sname nvarchar 30 sgentle nvarchar 2 sage int,sbirth smalldatetime,sdept nvarchar 30 drop table studen...
SQLSERVER儲存過程
sqlserver儲存過程使用說明書 引言首先介紹一下什麼是儲存過程 儲存過程就是將常用的或很複雜的工作,預先用 sql語句寫好並用乙個指定的名稱儲存起來,並且這樣的語句是放在資料庫中的,還可以根據條件執行不同 sql語句,那麼以後要叫資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫 ex...