SQL SERVER資料庫開發之儲存過程的應用

2021-04-09 07:27:01 字數 4930 閱讀 8603

標  題: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做開發也已經有段日子,但還沒有或者很少在專案中使用儲存過程,或許有些朋友認為根本沒有必要使用儲存過程等等。其實當你乙個專案做完到了維護階段時,就會發現儲存過程給我們帶來了好處了,修改方便,不能去改我們的應用程式,只需要改儲存過程的內容,而且還可以使我們的程式...