日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

存储过程学习笔记(SQL数据库

發(fā)布時間:2025/7/14 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 存储过程学习笔记(SQL数据库 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、???存儲過程簡介

Sql Server的存儲過程是一個被命名的存儲在服務(wù)器上的Transacation-Sql語句集合,是封裝重復(fù)性工作的一種方法,它支持用戶聲明的變量、條件執(zhí)行和其他強大的編程功能。

存儲過程相對于其他的數(shù)據(jù)庫訪問方法有以下的優(yōu)點:

(1)重復(fù)使用。存儲過程可以重復(fù)使用,從而可以減少數(shù)據(jù)庫開發(fā)人員的工作量。

????(2)提高性能。存儲過程在創(chuàng)建的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的SQL語句每執(zhí)行一次就需要編譯一次,所以使用存儲過程提高了效率。

????(3)減少網(wǎng)絡(luò)流量。存儲過程位于服務(wù)器上,調(diào)用的時候只需要傳遞存儲過程的名稱以及參數(shù)就可以了,因此降低了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。

????(4)安全性。參數(shù)化的存儲過程可以防止SQL注入式的攻擊,而且可以將Grant、Deny以及Revoke權(quán)限應(yīng)用于存儲過程。

????存儲過程一共分為了三類:用戶定義的存儲過程、擴展存儲過程以及系統(tǒng)存儲過程。

????其中,用戶定義的存儲過程又分為Transaction-SQL和CLR兩種類型。

????Transaction-SQL?存儲過程是指保存的Transaction-SQL語句集合,可以接受和返回用戶提供的參數(shù)。

????CLR存儲過程是指對.Net Framework公共語言運行時(CLR)方法的引用,可以接受和返回用戶提供的參數(shù)。他們在.Net Framework程序集中是作為類的公共靜態(tài)方法實現(xiàn)的。(本文就不作介紹了)

二、???存儲過程的創(chuàng)建

例如:

--?如果存儲過程存在,就刪除

IF Object_ID('proc_GetWellProduct') IS NOT NULL

????????DROP PROCEDURE proc_GetWellProduct

GO

?

--?創(chuàng)建儲存過程

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、語法:

DECLARE +“變量名”+“類型”

例如:

declare @ID int --申明一個名為@ID的變量,類型為int型

五、???變量賦值

例如:

--從數(shù)據(jù)表中取出第一行數(shù)據(jù)的ID,賦值給變量@id,然后打印出來

Declare @ID int

Set @ID = (select top(1) categoryID from categories)

Print @ID

注意:賦值時如果是SQl查詢語句,整個查詢語句都要用括號括起來。

六、???打印

在SQL Server窗口中打印出變量的值?

語法:

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).

八、???語句塊

形式:Begin ... end

將多條語句作為一個塊,類似與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)機幫助里面找的資料

返回值??說明?

0:?????FETCH?語句成功。

-1:????FETCH?語句失敗或行不在結(jié)果集中。

-2:????提取的行不存在。

十、???執(zhí)行其他存儲過程?EXEC

EXEC?存儲過程名 參數(shù)1,參數(shù)2...

例如

EXEC proc_GetWellProduct 1,'2011-07-01'

十一、?游標

1、游標的簡介:

游標(Cursor)是處理數(shù)據(jù)的一種方法,為了查看或者處理結(jié)果集中的數(shù)據(jù),游標提供了在結(jié)果集中一次以行或者多行前進或向后瀏覽數(shù)據(jù)的能力。我們可以把游標當作一個指針,它可以指定結(jié)果中的任何位置,然后允許用戶對指定位置的數(shù)據(jù)進行處理。

2、游標的組成:

1)、游標包含兩個部分:一個是游標結(jié)果集、一個是游標位置。

2)、游標結(jié)果集:定義該游標得SELECT語句返回的行的集合。

游標位置:指向這個結(jié)果集某一行的當前指針。

3、游標的分類:

游標共有3類:API服務(wù)器游標、Transaction-SQL游標和API客戶端游標。其中前兩種游標都是運行在服務(wù)器上的,所以又叫做服務(wù)器游標。

API服務(wù)器游標

????API服務(wù)器游標主要應(yīng)用在服務(wù)上,當客戶端的應(yīng)用程序調(diào)用API游標函數(shù)時,服務(wù)器會對API函數(shù)進行處理。使用API函數(shù)和方法可以實現(xiàn)如下功能:

???(1)打開一個連接。

???(2)設(shè)置定義游標特征的特性或?qū)傩?#xff0c;API自動將游標影射到每個結(jié)果集。

???(3)執(zhí)行一個或多個Transaction-SQL語句。

???(4)使用API函數(shù)或方法提取結(jié)果集中的行。

????API服務(wù)器游標包含以下四種:靜態(tài)游標、動態(tài)游標、只進游標、鍵集驅(qū)動游標(Primary key)

????靜態(tài)游標的完整結(jié)果集將打開游標時建立的結(jié)果集存儲在臨時表中,(靜態(tài)游標始終是只讀的)。靜態(tài)游標具有以下特點:總是按照打開游標時的原樣顯示結(jié)果集;不反映數(shù)據(jù)庫中作的任何修改,也不反映對結(jié)果集行的列值所作的更改;不顯示打開游標后在數(shù)據(jù)庫中新插入的行;組成結(jié)果集的行被其他用戶更新,新的數(shù)據(jù)值不會顯示在靜態(tài)游標中;但是靜態(tài)游標會顯示打開游標以后從數(shù)據(jù)庫中刪除的行。

????動態(tài)游標與靜態(tài)游標相反,當滾動游標時動態(tài)游標反映結(jié)果集中的所有更改。結(jié)果集中的行數(shù)據(jù)值、順序和成員每次提取時都會改變。

????只進游標不支持滾動,它只支持游標從頭到尾順序提取數(shù)據(jù)行。注意:只進游標也反映對結(jié)果集所做的所有更改。

鍵集驅(qū)動游標同時具有靜態(tài)游標和動態(tài)游標的特點。當打開游標時,該游標中的成員以及行的順序是固定的,鍵集在游標打開時也會存儲到臨時工作表中,對非鍵集列的數(shù)據(jù)值的更改在用戶游標滾動的時候可以看見,在游標打開以后對數(shù)據(jù)庫中插入的行是不可見的,除非關(guān)閉重新打開游標。

?

Transaction-SQL游標

????該游標是基于Declare Cursor?語法,主要用于Transaction-SQL腳本、存儲過程以及觸發(fā)器中。Transaction-SQL游標在服務(wù)器處理由客戶端發(fā)送到服務(wù)器的Transaction-SQL語句。

????在存儲過程或觸發(fā)器中使用Transaction-SQL游標的過程為:

???(1)聲明Transaction-SQL變量包含游標返回的數(shù)據(jù)。為每個結(jié)果集列聲明一個變量。聲明足夠大的變量來保存列返回的值,并聲明變量的類型為可從數(shù)據(jù)類型隱式轉(zhuǎn)換得到的數(shù)據(jù)類型。

???(2)使用Declare Cursor語句將Transaction-SQL游標與Select語句相關(guān)聯(lián)。還可以利用Declare Cursor定義游標的只讀、只進等特性。 

???(3)使用Open語句執(zhí)行Select語句填充游標。

???(4)使用Fetch Into語句提取單個行,并將每列中得數(shù)據(jù)移至指定的變量中。注意:其他Transaction-SQL語句可以引用那些變量來訪問提取的數(shù)據(jù)值。Transaction-SQL游標不支持提取行塊。

???(5)使用Close語句結(jié)束游標的使用。注意:關(guān)閉游標以后,該游標還是存在,可以使用Open命令打開繼續(xù)使用,只有調(diào)用Deallocate語句才會完全釋放。

?

客戶端游標

該游標將使用默認結(jié)果集把整個結(jié)果集高速緩存在客戶端上,所有的游標操作都在客戶端的高速緩存中進行。注意:客戶端游標只支持只進和靜態(tài)游標。不支持其他游標。

?

4、游標的生命周期

游標的生命周期包含有五個階段:聲明游標、打開游標、讀取游標數(shù)據(jù)、關(guān)閉游標、釋放游標。

[1]聲明游標:

是為游標指定獲取數(shù)據(jù)時所使用的Select語句,聲明游標并不會檢索任何數(shù)據(jù),它只是為游標指明了相應(yīng)的Select?語句。

Declare?游標名稱?Cursor?參數(shù)

聲明游標的參數(shù):

(1)Local與Global:Local表示游標的作用于僅僅限于其所在的存儲過程、觸發(fā)器以及批處理中、執(zhí)行完畢以后游標自動釋放。Global表示的是該游標作用域是整個會話層。由連接執(zhí)行的任何存儲過程、批處理等都可以引用該游標名稱,僅在斷開連接時隱性釋放。

(2)Forward_only與Scroll:前者表示為只進游標,后者表示為可以隨意定位。默認為前者。

(3)Static、Keyset與Dynamic:?第一個表示定義一個游標,其數(shù)據(jù)存放到一個臨時表內(nèi),對游標的所有請求都從臨時表中應(yīng)答,因此,對該游標進行提取操作時返回的數(shù)據(jù)不反映對基表所作的修改,并且該游標不允許修改。Keyset表示的是,當游標打開時,鍵集驅(qū)動游標中行的身份與順序是固定的,并把其放到臨時表中。Dynamic表示的是滾動游標時,動態(tài)游標反映對結(jié)果集內(nèi)所有數(shù)據(jù)的更改。

(4)Read_only?、Scroll_Locks與Optimistic:第一個表示的是只讀游標,第二個表示的是在使用的游標結(jié)果集數(shù)據(jù)上放置鎖,當行讀取到游標中然后對它們進行修改時,數(shù)據(jù)庫將鎖定這些行,以保證數(shù)據(jù)的一致性。Optimistic的含義是游標將數(shù)據(jù)讀取以后,如果這些數(shù)據(jù)被更新了,則通過游標定位進行的更新與刪除操作將不會成功。

標準游標:

Declare MyCursor Cursor?
????????????For Select * From Master_Goods

只讀游標

Declare MyCusror Cursor

??????? For Select * From Master_Goods

????????For Read Only

可更新游標

Declare MyCusror Cursor

????????For Select * From Master_Goods

????????For UpDate

[2]打開游標:

使用Open語句用于打開Transaction-SQL服務(wù)器游標,執(zhí)行Open語句的過程中就是按照Select語句進行填充數(shù)據(jù),打開游標以后游標位置在第一行。

打開游標:

全局游標:Open Global MyCursor????????????局部游標: Open MyCursor

[3]讀取游標數(shù)據(jù):

在打開游標以后,使用Fetch語句從Transaction-SQL服務(wù)器游標中檢索特定的一行。使用Fetch操作,可以使游標移動到下一個記錄,并將游標返回的每個列得數(shù)據(jù)分別賦值給聲明的本地變量。

Fetch [Next | Prior | First | Last | Absolute n | Relative n ]? From MyCursor

Into @GoodsID,@GoodsName

其中:

Next表示返回結(jié)果集中當前行的下一行記錄,如果第一次讀取則返回第一行。默認的讀取選項為Next

Prior表示返回結(jié)果集中當前行的前一行記錄,如果第一次讀取則沒有行返回,并且把游標置于第一行之前。

First表示返回結(jié)果集中的第一行,并且將其作為當前行。

Last表示返回結(jié)果集中的最后一行,并且將其作為當前行。

Absolute n 如果n為正數(shù),則返回從游標頭開始的第n行,并且返回行變成新的當前行。如果n為負,則返回從游標末尾開始的第n行,并且返回行為新的當前行,如果n為0,則返回當前行。

Relative n 如果n為正數(shù),則返回從當前行開始的第n行,如果n為負,則返回從當前行之前的第n行,如果為0,則返回當前行。

[4]關(guān)閉游標:

調(diào)用的是Close語句,方式如下:Close Global MyCursor?????? Close MyCursor

[5]釋放游標:

調(diào)用的是Deallocate語句,方法如下:Deallocate Glboal MyCursor???????Deallocate MyCursor

?

十二、?經(jīng)驗小結(jié)

1、存儲過程里定義不了數(shù)組。如果是sqlserver,那么你可以用表變量,游標來實現(xiàn)你的功能。

2、Top函數(shù)中如果有參數(shù),則參數(shù)要用括號括起來,否則會報錯。

例如:

select Top?(@i)?WellID From T_Well where PlatformID =@PlatformID order by WellID asc

3、判斷一個查詢值是否為空(有記錄,只是值為“NULL”)

例如:

????????--申明一個變量

Declare @WellProduct int

--給變量賦值(@WellID為一個已賦值的參數(shù))

set @WellProduct=(select WellProduct from T_WellRecord where WellID=@WellID)

--判斷

IF (@WellProduct IS not NULL)

????......

4、判斷查詢的記錄是否為空(既不存在這條記錄)

例如:

--?判斷(@WellID為一個已賦值的參數(shù))?????????????????????

if exists(select WellID from T_Well where WellID=@WellID)

轉(zhuǎn)載于:https://www.cnblogs.com/lfxiao/p/6860451.html

總結(jié)

以上是生活随笔為你收集整理的存储过程学习笔记(SQL数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。