sql server儲存過程語法
定義總是很抽象。儲存過程其實就是能完成一定操作的一組SQL語句,只不過這組語句是放在資料庫中的(這裡我們只談SQL Server)。如果我們通過建立儲存過程以及在ASP中呼叫儲存過程,就可以避免將SQL語句同ASP程式碼混雜在一起。這樣做的好處至少有三個:
第一、大大提高效率。儲存過程本身的執行速度非常快,而且,呼叫儲存過程可以大大減少同資料庫的互動次數。
第二、提高安全性。假如將SQL語句混合在ASP程式碼中,一旦程式碼失密,同時也就意味著庫結構失密。
第三、有利於SQL語句的重用。
在ASP中,一般通過command物件呼叫儲存過程,根據不同情況,本文也介紹其它呼叫方法。為了方便說明,根據儲存過程的輸入輸出,作以下簡單分類:
1. 只返回單一記錄集的儲存過程
假設有以下儲存過程(本文的目的不在於講述T-SQL語法,所以儲存過程只給出程式碼,不作說明):
/*SP1*/
CREATE PROCEDURE dbo.getUserList
as
set nocount on
begin
select * from dbo.[userinfo]
end
go
以上儲存過程取得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
as
set nocount on
begin
delete from dbo.[userinfo]
end
go
該儲存過程刪去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
as
set nocount on
begin
BEGIN TRANSACTION
delete from dbo.[userinfo]
IF @@error=0
begin
COMMIT TRANSACTION
return 1
end
ELSE
begin
ROLLBACK TRANSACTION
return 0
end
return
end
go
以上儲存過程,在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)
MyComm.Parameters.Append MyPara
MyComm.Execute
'取得返回值
DIM retValue
retValue = MyComm(0) '或retValue = MyComm.Parameters(0)
Set MyComm = Nothing
在MyComm.CreateParameter("RETURN",2,4)中,各引數的含義如下:
第一個引數("RETURE")為引數名。引數名可以任意設定,但一般應與儲存過程中宣告的引數名相同。此處是返回值,我習慣上設為"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程式碼,應該說是完整的程式碼,也即最複雜的程式碼,其實
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
可以簡化為
MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)
甚至還可以繼續簡化,稍後會做說明。
對於帶引數的儲存過程,只能使用Command物件呼叫(也有資料說可通過Connection物件或Recordset物件呼叫,但我沒有試成過)。
4. 有輸入引數和輸出引數的儲存過程
返回值其實是一種特殊的輸出引數。在大多數情況下,我們用到的是同時有輸入及輸出引數的儲存過程,比如我們想取得使用者資訊表中,某ID使用者的使用者名稱,這時候,有一個輸入引數----使用者ID,和一個輸出引數----使用者名稱。實現這一功能的儲存過程如下:
/*SP4*/
CREATE PROCEDURE dbo.getUserName
@UserID int,
@UserName varchar(40) output
as
set nocount on
begin
if @UserID is null return
select @UserName=username
from dbo.[userinfo]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-551833/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server 儲存過程SQLServer儲存過程
- 【SQL Server】--儲存過程SQLServer儲存過程
- MS SQL Server儲存過程SQLServer儲存過程
- Sql Server系列:儲存過程SQLServer儲存過程
- 解密SQL SERVER儲存過程解密SQLServer儲存過程
- 儲存過程語法儲存過程
- SQL Server基礎:儲存過程SQLServer儲存過程
- SQL server儲存過程函式SQLServer儲存過程函式
- 儲存過程 與 SQL Server語句大比拼儲存過程SQLServer
- 儲存過程基本語法儲存過程
- SQL Server 儲存過程的運用SQLServer儲存過程
- SQL Server基礎之儲存過程SQLServer儲存過程
- (SQL Server)分頁的儲存過程SQLServer儲存過程
- Oracle儲存過程基本語法Oracle儲存過程
- SQL Server 禁用擴充套件儲存過程SQLServer套件儲存過程
- SQL Server 資料備份儲存過程SQLServer儲存過程
- ms sql server儲存過程目前使用模板SQLServer儲存過程
- SQL Server儲存過程中raiserror的使用SQLServer儲存過程AIError
- SQL Server儲存過程的優缺點SQLServer儲存過程
- 【SQL Server】常見系統儲存過程SQLServer儲存過程
- SER SERVER儲存過程Server儲存過程
- SQL SERVER儲存過程AS和GO的含義SQLServer儲存過程Go
- Java呼叫SQL Server的儲存過程詳解JavaSQLServer儲存過程
- 【fosoyo】SQL Server儲存過程/函式加/解密SQLServer儲存過程函式解密
- 幾個實用SQL Server取儲存過程SQLServer儲存過程
- SQL SERVER 2005分頁儲存過程SQLServer儲存過程
- MySql儲存過程的作用及語法MySql儲存過程
- SQL儲存過程示例SQL儲存過程
- SQL Server 資料訪問策略:儲存過程QCSQLServer儲存過程
- SQL Server系統儲存過程和引數示例SQLServer儲存過程
- 【stswordman】SQL Server 2005: 儲存過程簽名SQLServer儲存過程
- 編寫和優化SQL Server的儲存過程優化SQLServer儲存過程
- SQL Server 儲存過程的經典分頁(轉)SQLServer儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- EF中使用SQL語句或儲存過程SQL儲存過程
- 一個SQL Server Sa密碼破解的儲存過程SQLServer密碼儲存過程
- SQL Server系統儲存過程和引數總結SQLServer儲存過程
- 小寫轉大寫金額儲存過程[SQL SERVER]儲存過程SQLServer