存儲過程

存儲過程簡介sql


什麼是存儲過程:存儲過程能夠說是一個記錄集吧,它是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼像一個方法同樣實現一些功能(對單表或多表的增刪改查),而後再給這個代碼塊取一個名字,在用到這個功能的時候調用他就好了。

存儲過程的好處

1.因爲數據庫執行動做時,是先編譯後執行的。然而存儲過程是一個編譯過的代碼塊,因此執行效率要比T-SQL語句高。

2.一個存儲過程在程序在網絡中交互時能夠替代大堆的T-SQL語句,因此也能下降網絡的通訊量,提升通訊速率。

3.經過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而確保數據的安全。

小結:總之存儲過程是好東西,在作項目時屬於必備利器,下面介紹存儲過程的基本語法。數據庫


存儲過程的語法和參數講解c#


存儲過程的一些基本語法:緩存

複製代碼
--------------建立存儲過程-----------------

CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]

[ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

[ FOR REPLICATION ]

AS sql_statement [ ...n ]

--------------調用存儲過程-----------------

EXECUTE Procedure_name '' --存儲過程若是有參數,後面加參數格式爲:@參數名=value,也可直接爲參數值value

--------------刪除存儲過程-----------------

drop procedure procedure_name    --在存儲過程當中能調用另一個存儲過程,而不能刪除另一個存儲過程
複製代碼

建立存儲過程的參數:
1.procedure_name :存儲過程的名稱,在前面加#爲局部臨時存儲過程,加##爲全局臨時存儲過程。

2.; number:是可選的整數,用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句便可將同組的過程一塊兒除去。例如,名爲 orders 的應用程序使用的過程能夠命名爲 orderproc;一、orderproc;2 等。DROP PROCEDURE orderproc 語句將除去整個組。若是名稱中包含定界標識符,則數字不該包含在標識符中,只應在 procedure_name 先後使用適當的定界符。 

3.@parameter: 存儲過程的參數。能夠有一個或多個。用戶必須在執行過程時提供每一個所聲明參數的值(除非定義了該參數的默認值)。存儲過程最多能夠有 2.100 個參數。 
使用 @ 符號做爲第一個字符來指定參數名稱。參數名稱必須符合標識符的規則。每一個過程的參數僅用於該過程自己;相同的參數名稱能夠用在其它過程當中。默認狀況下,參數只能代替常量,而不能用於代替表名、列名或其它數據庫對象的名稱。有關更多信息,請參見 EXECUTE。 

4.data_type:參數的數據類型。全部數據類型(包括 text、ntext 和 image)都可以用做存儲過程的參數。不過,cursor 數據類型只能用於 OUTPUT 參數。若是指定的數據類型爲 cursor,也必須同時指定 VARYING 和 OUTPUT 關鍵字。有關 SQL Server 提供的數據類型及其語法的更多信息,請參見數據類型。 
說明 對於能夠是 cursor 數據類型的輸出參數,沒有最大數目的限制。 

5.VARYING: 指定做爲輸出參數支持的結果集(由存儲過程動態構造,內容能夠變化)。僅適用於遊標參數。 安全

6.default: 參數的默認值。若是定義了默認值,沒必要指定該參數的值便可執行過程。默認值必須是常量或 NULL。若是過程將對該參數使用 LIKE 關鍵字,那麼默認值中能夠包含通配符(%、_、[] 和 [^])。服務器

7.OUTPUT :代表參數是返回參數。該選項的值能夠返回給 EXEC[UTE]。使用 OUTPUT 參數可將信息返回給調用過程。Text、ntext 和 image 參數可用做 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數能夠是遊標佔位符。 網絡

8.RECOMPILE: 代表 SQL Server 不會緩存該過程的計劃,該過程將在運行時從新編譯。在使用非典型值或臨時值而不但願覆蓋緩存在內存中的執行計劃時,請使用 RECOMPILE 選項。加密

9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程做爲 SQL Server 複製的一部分發布。 說明 在升級過程當中,SQL Server 利用存儲在 syscomments 中的加密註釋來從新建立加密過程。 spa

10.FOR REPLICATION :指定不能在訂閱服務器上執行爲複製建立的存儲過程。.使用 FOR REPLICATION 選項建立的存儲過程可用做存儲過程篩選,且只能在複製過程當中執行。本選項不能和 WITH RECOMPILE 選項一塊兒使用。 code

11.AS :指定過程要執行的操做。

12.sql_statement :過程當中要包含的任意數目和類型的 Transact-SQL 語句。但有一些限制。

小結:看過這些基本語法後,下面我就根據語法建立各式的存儲過程。


 建立存儲過程


 

UserAccount
UserID UserName PassWord RegisterTime RegisterIP
12 6                    6                    2012-12-31 6
18 5                    5                    2013-01-01 5
19 1                    1                    2013-01-01 1
20 2                    2                    2013-01-01 2
21 3                    3                    2013-01-01 3
22 4                    4                    2013-01-01 4
23 5                    5                    2013-01-01 5
25 7                    7                    2013-01-01 7
26 8                    8                    2013-01-01 8
NULL NULL NULL NULL NULL

針對上面的表,我使用存儲過程對它作一些操做:

1. 只返回單一記錄集的存儲過程 

複製代碼
-------------建立名爲GetUserAccount的存儲過程----------------
create Procedure GetUserAccount
as
select * from UserAccount
go

-------------執行上面的存儲過程----------------
exec GetUserAccount
複製代碼

 結果:至關於運行 select * from UserAccount 這行代碼,結果爲整個表的數據。

2.沒有輸入輸出的存儲過程 

複製代碼
-------------建立名爲GetUserAccount的存儲過程----------------

create Procedure inUserAccount
as
insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9)
go

-------------執行上面的存儲過程----------------

exec inUserAccount
複製代碼

 結果:至關於運行 insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9) 這行代碼。

3.有返回值的存儲過程 

複製代碼
-------------建立名爲GetUserAccount的存儲過程----------------

create Procedure inUserAccountRe
as
insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(10,10,'2013-01-02',10)
return @@rowcount
go

-------------執行上面的存儲過程----------------

exec inUserAccountRe
複製代碼

 解釋:這裏的@@rowcount爲執行存儲過程影響的行數,執行的結果是不只插入了一條數據,還返回了一個值即 return value =1  ,這個能夠在程序中獲取,稍後在c#調用存儲過程當中會有說到。

4.有輸入參數和輸出參數的存儲過程 

複製代碼
-------------建立名爲GetUserAccount的存儲過程----------------

create Procedure GetUserAccountRe
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
go

-------------執行上面的存儲過程----------------

exec GetUserAccountRe '7',null
複製代碼

 解釋:@UserName爲輸入參數,@UserID爲輸出參數。 運行結果爲@userID爲COOUT(*)即 =1。

5. 同時具備返回值、輸入參數、輸出參數的存儲過程 

複製代碼
-------------建立名爲GetUserAccount的存儲過程----------------

create Procedure GetUserAccountRe1
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
return @@rowcount
go

-------------執行上面的存儲過程----------------

exec GetUserAccountRe1 '7',null
複製代碼

 結果:@userID爲COOUT(*)即 =1,Retun Value=1。

6.同時返回參數和記錄集的存儲過程 

複製代碼
-------------建立名爲GetUserAccount的存儲過程----------------

create Procedure GetUserAccountRe2
@UserName nchar(20),
@UserID int output
as
if(@UserName>5)
select @UserID=COUNT(*) from UserAccount where UserID>25
else
set @UserID=1000
select * from UserAccount
return @@rowcount
go

-------------執行上面的存儲過程----------------

exec GetUserAccountRe2 '7',null
複製代碼

 結果:返回執行 select * from UserAccount 這句代碼的結果集,同時@userID爲COOUT(*)即 =1,Retun Value=9。 

7.返回多個記錄集的存儲過程 

複製代碼
-------------建立名爲GetUserAccount的存儲過程----------------

create Procedure GetUserAccountRe3
as
select * from UserAccount
select * from UserAccount where UserID>5
go

-------------執行上面的存儲過程----------------

exec GetUserAccountRe3
複製代碼

 結果:返回兩個結果集,一個爲 select * from UserAccount,另外一個爲 select * from UserAccount where UserID>5 。

小結:上面咱們建立了各式的存儲過程,下面看咱們在c#中怎樣調用這些存儲過程。


 c#調用存儲過程


 這裏調用的存儲過程爲上面我寫的那些各式各樣的存儲過程。

View Code

附帶SQLServer數據庫的一些全局變量


 

View Code
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息