咨詢電話:023-6276-4481
熱門(mén)文章
電 話:023-6276-4481
郵箱:broiling@qq.com
地址:重慶市南岸區(qū)亞太商谷6幢25-2
一、 存儲(chǔ)過(guò)程簡(jiǎn)介
Sql Server的存儲(chǔ)過(guò)程是一個(gè)被命名的存儲(chǔ)在服務(wù)器上的Transacation-Sql語(yǔ)句集合,是封裝重復(fù)性工作的一種方法,它支持用戶聲明的變量、條件執(zhí)行和其他強(qiáng)大的編程功能。
存儲(chǔ)過(guò)程相對(duì)于其他的數(shù)據(jù)庫(kù)訪問(wèn)方法有以下的優(yōu)點(diǎn):
(1)重復(fù)使用。存儲(chǔ)過(guò)程可以重復(fù)使用,從而可以減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。
(2)提高性能。存儲(chǔ)過(guò)程在創(chuàng)建的時(shí)候就進(jìn)行了編譯,將來(lái)使用的時(shí)候不用再重新編譯。一般的SQL語(yǔ)句每執(zhí)行一次就需要編譯一次,所以使用存儲(chǔ)過(guò)程提高了效率。
(3)減少網(wǎng)絡(luò)流量。存儲(chǔ)過(guò)程位于服務(wù)器上,調(diào)用的時(shí)候只需要傳遞存儲(chǔ)過(guò)程的名稱以及參數(shù)就可以了,因此降低了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。
(4)安全性。參數(shù)化的存儲(chǔ)過(guò)程可以防止SQL注入式的攻擊,而且可以將Grant、Deny以及Revoke權(quán)限應(yīng)用于存儲(chǔ)過(guò)程。
存儲(chǔ)過(guò)程一共分為了三類:用戶定義的存儲(chǔ)過(guò)程、擴(kuò)展存儲(chǔ)過(guò)程以及系統(tǒng)存儲(chǔ)過(guò)程。
其中,用戶定義的存儲(chǔ)過(guò)程又分為Transaction-SQL和CLR兩種類型。
Transaction-SQL 存儲(chǔ)過(guò)程是指保存的Transaction-SQL語(yǔ)句集合,可以接受和返回用戶提供的參數(shù)。
CLR存儲(chǔ)過(guò)程是指對(duì).Net Framework公共語(yǔ)言運(yùn)行時(shí)(CLR)方法的引用,可以接受和返回用戶提供的參數(shù)。他們?cè)?span style="line-height: 1.5">.Net Framework程序集中是作為類的公共靜態(tài)方法實(shí)現(xiàn)的。(本文就不作介紹了)
二、 存儲(chǔ)過(guò)程的創(chuàng)建
例如:
-- 如果存儲(chǔ)過(guò)程存在,就刪除
IF Object_ID('proc_GetWellProduct') IS NOT NULL
DROP PROCEDURE proc_GetWellProduct
GO
-- 創(chuàng)建儲(chǔ)存過(guò)程
CREATE PROCEDURE proc_GetWellProduct
AS
......
三、 注釋
1、-- 單行注釋,從這到本行結(jié)束為注釋,類似C++,c#中//
2、/* … */ 多行注釋,類似C++,C#中/* … */
四、 變量
變量類型:
(int, smallint, tinyint, decimal,float,real, money ,smallmoney, text ,image, char, varchar......)
2、語(yǔ)法:
DECLARE +“變量名”+“類型”
例如:
declare @ID int --申明一個(gè)名為@ID的變量,類型為int型
五、 變量賦值
例如:
--從數(shù)據(jù)表中取出第一行數(shù)據(jù)的ID,賦值給變量@id,然后打印出來(lái)
Declare @ID int
Set @ID = (select top(1) categoryID from categories)
Print @ID
注意:賦值時(shí)如果是SQl查詢語(yǔ)句,整個(gè)查詢語(yǔ)句都要用括號(hào)括起來(lái)。
六、 打印
在SQL Server窗口中打印出變量的值
語(yǔ)法:
PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr
七、 比較操作符
? > (greater than).
? < (less than).
? = (equals).
? <= (less than or equal to).
? >= (greater than or equal to).
? != (not equal to).
? <> (not equal to).
? !< (not less than).
? !> (not greater than).
八、 語(yǔ)句塊
形式:Begin ... end
將多條語(yǔ)句作為一個(gè)塊,類似與C++,C#中的{ }
例如:
IF (......)
begin
......
End
九、 While(@@fetch_status = 0)循環(huán)
DECLARE @strLoginID VARCHAR(16)
BEGIN
declare db cursor for
SELECT LoginID FROM dbo.s_Users WHERE len(UnitCoding) in(9,12)
END
open db
fetch next from db into @strLoginID
while @@fetch_status = 0
BEGIN
insert into s_P_User
select @strLoginID,LevelID from s_P_User where LoginID = 'aa'
fetch next from db into @strLoginID
END
close db
deallocate db
@@fetch_status = 0?如何理解?這是我從聯(lián)機(jī)幫助里面找的資料
返回值 說(shuō)明
0: FETCH 語(yǔ)句成功。
-1: FETCH 語(yǔ)句失敗或行不在結(jié)果集中。
-2: 提取的行不存在。
十、 執(zhí)行其他存儲(chǔ)過(guò)程 EXEC
EXEC 存儲(chǔ)過(guò)程名 參數(shù)1,參數(shù)2...
例如
EXEC proc_GetWellProduct 1,'2011-07-01'
十一、 游標(biāo)
1、游標(biāo)的簡(jiǎn)介:
游標(biāo)(Cursor)是處理數(shù)據(jù)的一種方法,為了查看或者處理結(jié)果集中的數(shù)據(jù),游標(biāo)提供了在結(jié)果集中一次以行或者多行前進(jìn)或向后瀏覽數(shù)據(jù)的能力。我們可以把游標(biāo)當(dāng)作一個(gè)指針,它可以指定結(jié)果中的任何位置,然后允許用戶對(duì)指定位置的數(shù)據(jù)進(jìn)行處理。
2、游標(biāo)的組成:
1)、游標(biāo)包含兩個(gè)部分:一個(gè)是游標(biāo)結(jié)果集、一個(gè)是游標(biāo)位置。
2)、游標(biāo)結(jié)果集:定義該游標(biāo)得SELECT語(yǔ)句返回的行的集合。
游標(biāo)位置:指向這個(gè)結(jié)果集某一行的當(dāng)前指針。
3、游標(biāo)的分類:
游標(biāo)共有3類:API服務(wù)器游標(biāo)、Transaction-SQL游標(biāo)和API客戶端游標(biāo)。其中前兩種游標(biāo)都是運(yùn)行在服務(wù)器上的,所以又叫做服務(wù)器游標(biāo)。
API服務(wù)器游標(biāo)
API服務(wù)器游標(biāo)主要應(yīng)用在服務(wù)上,當(dāng)客戶端的應(yīng)用程序調(diào)用API游標(biāo)函數(shù)時(shí),服務(wù)器會(huì)對(duì)API函數(shù)進(jìn)行處理。使用API函數(shù)和方法可以實(shí)現(xiàn)如下功能:
(1)打開(kāi)一個(gè)連接。
(2)設(shè)置定義游標(biāo)特征的特性或?qū)傩裕?span style="line-height: 1.5">API自動(dòng)將游標(biāo)影射到每個(gè)結(jié)果集。
(3)執(zhí)行一個(gè)或多個(gè)Transaction-SQL語(yǔ)句。
(4)使用API函數(shù)或方法提取結(jié)果集中的行。
API服務(wù)器游標(biāo)包含以下四種:靜態(tài)游標(biāo)、動(dòng)態(tài)游標(biāo)、只進(jìn)游標(biāo)、鍵集驅(qū)動(dòng)游標(biāo)(Primary key)
靜態(tài)游標(biāo)的完整結(jié)果集將打開(kāi)游標(biāo)時(shí)建立的結(jié)果集存儲(chǔ)在臨時(shí)表中,(靜態(tài)游標(biāo)始終是只讀的)。靜態(tài)游標(biāo)具有以下特點(diǎn):總是按照打開(kāi)游標(biāo)時(shí)的原樣顯示結(jié)果集;不反映數(shù)據(jù)庫(kù)中作的任何修改,也不反映對(duì)結(jié)果集行的列值所作的更改;不顯示打開(kāi)游標(biāo)后在數(shù)據(jù)庫(kù)中新插入的行;組成結(jié)果集的行被其他用戶更新,新的數(shù)據(jù)值不會(huì)顯示在靜態(tài)游標(biāo)中;但是靜態(tài)游標(biāo)會(huì)顯示打開(kāi)游標(biāo)以后從數(shù)據(jù)庫(kù)中刪除的行。
動(dòng)態(tài)游標(biāo)與靜態(tài)游標(biāo)相反,當(dāng)滾動(dòng)游標(biāo)時(shí)動(dòng)態(tài)游標(biāo)反映結(jié)果集中的所有更改。結(jié)果集中的行數(shù)據(jù)值、順序和成員每次提取時(shí)都會(huì)改變。
只進(jìn)游標(biāo)不支持滾動(dòng),它只支持游標(biāo)從頭到尾順序提取數(shù)據(jù)行。注意:只進(jìn)游標(biāo)也反映對(duì)結(jié)果集所做的所有更改。
鍵集驅(qū)動(dòng)游標(biāo)同時(shí)具有靜態(tài)游標(biāo)和動(dòng)態(tài)游標(biāo)的特點(diǎn)。當(dāng)打開(kāi)游標(biāo)時(shí),該游標(biāo)中的成員以及行的順序是固定的,鍵集在游標(biāo)打開(kāi)時(shí)也會(huì)存儲(chǔ)到臨時(shí)工作表中,對(duì)非鍵集列的數(shù)據(jù)值的更改在用戶游標(biāo)滾動(dòng)的時(shí)候可以看見(jiàn),在游標(biāo)打開(kāi)以后對(duì)數(shù)據(jù)庫(kù)中插入的行是不可見(jiàn)的,除非關(guān)閉重新打開(kāi)游標(biāo)。
Transaction-SQL游標(biāo)
該游標(biāo)是基于Declare Cursor 語(yǔ)法,主要用于Transaction-SQL腳本、存儲(chǔ)過(guò)程以及觸發(fā)器中。Transaction-SQL游標(biāo)在服務(wù)器處理由客戶端發(fā)送到服務(wù)器的Transaction-SQL語(yǔ)句。
在存儲(chǔ)過(guò)程或觸發(fā)器中使用Transaction-SQL游標(biāo)的過(guò)程為:
(1)聲明Transaction-SQL變量包含游標(biāo)返回的數(shù)據(jù)。為每個(gè)結(jié)果集列聲明一個(gè)變量。聲明足夠大的變量來(lái)保存列返回的值,并聲明變量的類型為可從數(shù)據(jù)類型隱式轉(zhuǎn)換得到的數(shù)據(jù)類型。
(2)使用Declare Cursor語(yǔ)句將Transaction-SQL游標(biāo)與Select語(yǔ)句相關(guān)聯(lián)。還可以利用Declare Cursor定義游標(biāo)的只讀、只進(jìn)等特性?!?/span>
(3)使用Open語(yǔ)句執(zhí)行Select語(yǔ)句填充游標(biāo)。
(4)使用Fetch Into語(yǔ)句提取單個(gè)行,并將每列中得數(shù)據(jù)移至指定的變量中。注意:其他Transaction-SQL語(yǔ)句可以引用那些變量來(lái)訪問(wèn)提取的數(shù)據(jù)值。Transaction-SQL游標(biāo)不支持提取行塊。
(5)使用Close語(yǔ)句結(jié)束游標(biāo)的使用。注意:關(guān)閉游標(biāo)以后,該游標(biāo)還是存在,可以使用Open命令打開(kāi)繼續(xù)使用,只有調(diào)用Deallocate語(yǔ)句才會(huì)完全釋放。
客戶端游標(biāo)
該游標(biāo)將使用默認(rèn)結(jié)果集把整個(gè)結(jié)果集高速緩存在客戶端上,所有的游標(biāo)操作都在客戶端的高速緩存中進(jìn)行。注意:客戶端游標(biāo)只支持只進(jìn)和靜態(tài)游標(biāo)。不支持其他游標(biāo)。
4、游標(biāo)的生命周期
游標(biāo)的生命周期包含有五個(gè)階段:聲明游標(biāo)、打開(kāi)游標(biāo)、讀取游標(biāo)數(shù)據(jù)、關(guān)閉游標(biāo)、釋放游標(biāo)。