標 題:sql server資料庫開發之儲存過程的應用
作 者:栽培者
日 期:2005-12-27
序可能有不少朋友使用sql server做開發也已經有段日子,但還沒有或者很少在專案中使用儲存過程,或許有些朋友認為根本沒有必要使用儲存過程等等。其實當你乙個專案做完到了維護階段時,就會發現儲存過程給我們帶來了好處了,修改方便,不能去改我們的應用程式,只需要改儲存過程的內容,而且還可以使我們的程式速度得到提高。
引用:sql server 聯機叢書中的定義:
儲存過程是儲存起來的可以接受和返回使用者提供的引數的 transact-sql 語句的集合。
可以建立乙個過程供永久使用,或在乙個會話中臨時使用(區域性臨時過程),或在所有會話中臨時使用(全域性臨時過程)。
也可以建立在 microsoft sql server 啟動時自動執行的儲存過程。
要使用儲存過程,首先我們必需熟悉一些基本的t-sql語句,因為儲存過程是由於一組t-sql語句構成的,並且,我們需要了解一些關於函式、過程的概念,因為我們需要在應用程式中呼叫儲存過程,就像我們呼叫應用程式的函式一樣,不過呼叫的方法有些不同。
下面我們來看一下儲存過程的建立和使用方法。
一、建立儲存過程
和資料表一樣,在使用之前我們需要建立儲存過程,它的簡明語法是:
引用:create proc 儲存過程名稱
[引數列表(多個以「,」分隔)]
assql 語句
例:引用:
create proc upgetusername
@intuserid int,
@ostrusername nvarchar(20) output
-- 要輸出的引數
asbegin
-- 將uname的值賦給 @ostrusername 變數,即要輸出的引數
select @ostrusername=uname from uuser where uid=@intuserid
end
其中 create proc 語句(完整語句為create procedure)的意思就是告訴sql server,現在需要建立乙個儲存過程,upgetusername 就是儲存過程名稱,@intuserid 和 @ostrusername 分別是該儲存過程的兩個引數,注意,在sql server中,所有使用者定義的變數都以「
@」開頭,
output關鍵字表示這個引數是用來輸出的,
as之後就是儲存過程內容了。只要將以上**在「查詢分析器」裡執行一次,sql server就會在當前資料庫中建立乙個名為「upgetusername」的儲存過程。你可以開啟「企業管理器」,選擇當前操作的資料庫,然後在左邊的樹型列表中選擇「儲存過程」,此時就可以在右邊的列表中看到你剛剛建立的儲存過程了(如果沒有,重新整理一下即可)。
二、儲存過程的呼叫
之前我們已經建立了乙個名為「upgetusername」的儲存過程,從字面理解該儲存過程的功能是用來取得某乙個使用者的名稱。儲存過程建立好了,接下來就是要在應用程式裡呼叫了,下面看一下在asp程式裡的呼叫。
引用:dim adocomm
'// 建立乙個物件,我們用來呼叫儲存過程
set adocomm = createobject("adodb.command")
with adocomm
'// 設定連線,設 adoconn 為已經連線的 adodb.connection 物件
.activeconnection = adoconn
'// 型別為儲存過程,adcmdstoredproc = 4
.commandtype = 4
'// 儲存過程名稱
.commandtext = "upgetusername"
'// 設定使用者編號
.parameters.item("@intuserid").value = 1
'// 執行儲存過程
.execute
'// 取得從儲存過程返回的使用者名稱
response.write "使用者名稱:" & .parameters.item("@ostrusername").value
end with
'// 釋放物件
set adocomm = nothing
通過以上兩步,我們已經可以建立和使用簡單的儲存過程了。下面我們來看乙個稍微複雜點的儲存過程,以進一步了解儲存過程的應用。
三、儲存過程的實際應用
使用者登入在asp專案中經常會使用到,相信很多朋友也都做過類似的系統,但使用儲存過程來做驗證朋友可能不多,那麼我們就以它來做例子,寫乙個簡單的使用者登入驗證的儲存過程。
引用:create proc upuserlogin
@strloginname nvarchar(20),
@strloginpwd nvarchar(20),
@blnreturn bit output
as-- 定義乙個臨時用來儲存密碼的變數
declare @strpwd nvarchar(20)
begin
-- 從表中查詢當前使用者的密碼,賦值給 @strpwd 變數,下面要對他進行比較
select @strpwd=uloginpwd from uuser where uloginname=@strloginname
if @strloginpwd = @strpwd
begin
set @blnreturn = 1
-- 更新使用者最後登入時間
update uuser set ulastlogin=getdate() where uloginname=@strloginname
endelse
set @blnreturn = 0
end
使用者登入的儲存過程建立好了,現在在程式裡試一下吧。注意,在乙個區域內如果有多條語句時,必需使用
begin...end關鍵字。
引用:dim adocomm
'// 建立乙個物件,我們用來呼叫儲存過程
set adocomm = createobject("adodb.command")
with adocomm
'// 設定連線,設 adoconn 為已經連線的 adodb.connection 物件
.activeconnection = adoconn
'// 型別為儲存過程,adcmdstoredproc = 4
.commandtype = 4
'// 儲存過程名稱
.commandtext = "upuserlogin"
'// 設定登入名稱
.parameters.item("@strloginname").value = "admin"
'// 設定登入密碼
.parameters.item("@strloginpwd").value = "123456"
'// 執行儲存過程
.execute
'// 判斷是否登入成功
if .parameters.item("@blnreturn").value = 1 then
response.write "恭喜你,登入成功!"
else
response.write "不是吧,好像錯了哦。。。"
end if
end with
'// 釋放物件
set adocomm = nothing
通過以上的步驟,簡單使用者登入驗證過程也做完了,現在只要把它整合到程式中就可以實現簡單的使用者登入驗證了,關於其他細節就由你自己來處理了。
上面介紹的兩個儲存過程都是只返回乙個值的,下面我們來看乙個返回乙個記錄集的儲存過程。
引用:create proc upgetuserinfos
@intusergroup int
asbegin
-- 從資料庫中抽取符合條件的資料
select uname,ugroup,ulastlogin from uuser where ugroup=@intusergroup
-- 插入一列合計
union
select '合計人數:',count(ugroup),null from uuser where ugroup=@intusergroup
end
現在我們來看一下asp程式的呼叫。
引用:dim adocomm
dim adort
'// 建立乙個物件,我們用來呼叫儲存過程
set adocomm = createobject("adodb.command")
set adors = createobject("adodb.recordset")
with adocomm
'// 設定連線,設 adoconn 為已經連線的 adodb.connection 物件
.activeconnection = adoconn
'// 型別為儲存過程,adcmdstoredproc = 4
.commandtype = 4
'// 儲存過程名稱
.commandtext = "upgetuserinfos"
'// 設定使用者組
.parameters.item("@intusergroup").value = 1
'// 執行儲存過程,和以上幾個例子不同,這裡使用recordset的open方法
adors.open adocomm
'// 顯示第乙個值
response.write adors.fields(0).value
end with
'// 釋放物件
set adors = nothing
set adocomm = nothing
怎麼樣,是不是也很簡單呢,不過儲存過程的用處不僅僅只有這些,他還有更強大的功能,比如使用游標、臨時表來從多個表,甚至是多個資料庫中呼叫資料,然後返回給使用者,這些你可以在使用過程中慢慢的去發掘。
資料庫之SQLServer
sqlserver更改身份驗證方式 sqlserver中char varchar nchar nvarchar的區別 1 定義 char 固定長度,儲存ansi字元,不足的補英文半形空格。nchar 固定長度,儲存unicode字元,不足的補英文半形空格 varchar 可變長度,儲存ansi字元,...
SQLserver本地資料庫開發
遠端端資料庫中生成指令碼 注意 遠端端的資料庫 是中文版的還是英文版的,一般我們裝的是英文版的,如果遠端端資料庫是中文版的,那麼我們本地的是英文版,在生成的指令碼那需要修改,同時去除相應的路勁 修改為 如果我們想用vs自帶的db作為本地資料庫,那麼我們用 localdb mssqllocaldb 連...
SQL SERVER資料庫開發之儲存過程應用
序 可能有不少朋友使用sql server做開發也已經有段日子,但還沒有或者很少在專案中使用儲存過程,或許有些朋友認為根本沒有必要使用儲存過程等等。其實當你乙個專案做完到了維護階段時,就會發現儲存過程給我們帶來了好處了,修改方便,不能去改我們的應用程式,只需要改儲存過程的內容,而且還可以使我們的程式...