將常用的或很復雜的工作,預先用SQL語句寫好并用一個指定的名稱存儲起來, 那么以后要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
????????????????? 存儲過程的優點
??? 1.存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
??? 2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
??? 3.存儲過程可以重復使用,可減少數據庫開發人員的工作量
????4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
??????????????????????
創建存儲過程
*************************************************
語法
CREATE PROC[ EDURE ] [
owner
.
]
procedure_name
[
;
number
]
????[ { @
parameter data_type
}
????????
[ VARYING ] [
=
default
] [ OUTPUT ]
????
] [
,
...
n
]
[ WITH
????{ RECOMPILE | ENCRYPTION | RECOMPILE
,
ENCRYPTION } ]
[ FOR REPLICATION ]
AS
sql_statement
[ ...
n
]
參數
owner
??? 擁有存儲過程的用戶 ID 的名稱。 owner 必須是當前用戶的名稱或當前用戶所屬的角色的名稱。
procedure_name
??? 新存儲過程的名稱。過程名必須符合標識符規則,且對于數據庫及其所有者必須唯一。
; number
??? 是可選的整數,用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如,名為 orders 的應用程序使用的過程可以命名為 orderproc ;1、 orderproc ;2 等。DROP PROCEDURE orderproc 語句將除去整個組。如果名稱中包含定界標識符,則數字不應包含在標識符中,只應在 procedure_name 前后使用適當的定界符。
@ parameter
??? 過程中的參數。在 CREATE PROCEDURE 語句中可以聲明一個或多個參數。用戶必須在執行過程時提供每個所聲明參數的值(除非定義了該參數的默認值,或者該值設置為等于另一個參數)。存儲過程最多可以有 2.100 個參數。
使用 @ 符號作為第一個字符來指定參數名稱。參數名稱必須符合標識符的規則。每個過程的參數僅用于該過程本身;相同的參數名稱可以用在其它過程中。默認情況下,參數只能代替常量,而不能用于代替表名、列名或其它數據庫對象的名稱。
data_type
??? 參數的數據類型。除 table 之外的其他所有數據類型均可以用作存儲過程的參數。但是, cursor 數據類型只能用于 OUTPUT 參數。如果指定 cursor 數據類型,則還必須指定 VARYING 和 OUTPUT 關鍵字。對于可以是 cursor 數據類型的輸出參數,沒有最大數目的限制。
VARYING
??? 指定作為輸出參數支持的結果集(由存儲過程動態構造,內容可以變化)。僅適用于游標參數。
default
??? 參數的默認值。如果定義了默認值,不必指定該參數的值即可執行過程。默認值必須是常量或 NULL。如果過程將對該參數使用 LIKE 關鍵字,那么默認值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT
??? 表明參數是返回參數。該選項的值可以返回給 EXEC[UTE]。使用 OUTPUT 參數可將信息返回給調用過程。 Text 、 ntext 和 image 參數可用作 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數可以是游標占位符。
n
??? 表示最多可以指定 2.100 個參數的占位符。
{RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION}
????RECOMPILE 表明 SQL Server 不會緩存該過程的計劃,該過程將在運行時重新編譯。在使用非典型值或臨時值而不希望覆蓋緩存在內存中的執行計劃時,請使用 RECOMPILE 選項。
ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程作為 SQL Server 復制的一部分發布。
FOR REPLICATION
??? 指定不能在訂閱服務器上執行為復制創建的存儲過程。.使用 FOR REPLICATION 選項創建的存儲過程可用作存儲過程篩選,且只能在復制過程中執行。本選項不能和 WITH RECOMPILE 選項一起使用。
AS
?? 指定過程要執行的操作。
sql_statement
?? 過程中要包含的任意數目和類型的 Transact-SQL 語句。但有一些限制。
n
?? 是表示此過程可以包含多條 Transact-SQL 語句的占位符。
**********************************************
注:*所包圍部分來自MS的聯機叢書.
?
?????????????????????????? 幾個實例
??????????????????????? (AjaxCity表中內容)
ID??????? CityName?? Short
?????????????? 1?????????? 蘇州市 ??????? SZ
????????????? ?2 ? 無錫市?????? WX
?????????????? 3?????????? 常州市 ??????? CZ
1.選擇表中所有內容并返回一個數據集
??????? CREATE PROCEDURE mysp_All
??????? AS
?????????? select * from AjaxCity
????????GO
執行結果
???????
2.根據傳入的參數進行查詢并返回一個數據集
???????CREATE PROCEDURE mysp_para
??????????? @CityName varchar(255),
??????????? @Short??? varchar(255)
?????? AS
???????? select * from AjaxCity where
CityName=@CityName
?And
Short=@Short
?????? GO
執行結果
???????
3.帶有輸出參數的存儲過程(返回前兩條記錄的ID的和)
CREATE PROCEDURE mysp_output
?????? @SUM int? output
?AS
?????? select @SUM=sum([ID]) from (select top 2 * from AjaxCity) as tmpTable
GO
執行結果
????????
4.在存儲過程中使用游標
??有這樣一個表,存儲的是各超階級市下面的縣級市的信息.如圖:
??
?? 現在想統計出各個地級市下面的縣級市的個數,并組成一個字符串.結果應該是"5,2,2".
?
CREATE PROCEDURE mysp_Cursor
??? @Result varchar(255) output
//聲明輸出變量
AS
??? declare city_cursor cursor for
//聲明游標變量
??? select [ID] from AjaxCity
set @Result=''
declare @Field int
//聲明臨時存放CityID的變量
open city_cursor
//打開游標
fetch next from city_cursor into @Field
//將實際ID賦給變量
while(@@fetch_status=0)
//循環開始
begin
?????? if @Result = ''
?????????? select @Result = convert(nvarchar(2),count(*))? from AjaxCounty where
CityID=@Field
?????? else
?????????? select @Result = @Result + ',' + convert(nvarchar(2),count(*)) from AjaxCounty where
CityID=@Field
??????
?????? fetch next from city_cursor into @Field
//下一個CityID
end
close city_cursor
//關閉游標
deallocate city_cursor
//釋放游標引用
GO
?
執行結果
??????
?
??? 好了,關于存儲過程先寫到這里.以上幾個例子基本上實現了平常所用到的大部分功能.至于復雜的存儲過程,所用到的知道主要是SQL的語法,以及SQL中內置函數的使用.已不屬于本文所要討論的范圍了.
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
