国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

數(shù)據(jù)庫存儲過程 — Sql Server

2024-08-31 00:55:30
字體:
供稿:網(wǎng)友
數(shù)據(jù)庫存儲過程 — Sql Server

MySQL、Oracle等主流關(guān)系型數(shù)據(jù)庫基本都支持存儲過程,這里使用Sql Server為例進行說明。

存儲過程的概念:

Sql Server存儲過程

SQL Server 中的存儲過程是由一個或多個 Transact-SQL 語句或?qū)?Microsoft .NET Framework 公共語言運行時 (CLR) 方法的引用構(gòu)成的一個組。 簡單的說,非常類似與java中的方法,實質(zhì)就是部署在數(shù)據(jù)庫端的一組定義代碼以及SQL。

存儲過程的作用(優(yōu)點):

1.代碼的重復(fù)使用

任何重復(fù)的數(shù)據(jù)庫操作的代碼都非常適合于在過程中進行封裝。 這消除了不必要地重復(fù)編寫相同的代碼、降低了代碼不一致性,并且允許擁有所需權(quán)限的任何用戶或應(yīng)用程序訪問和執(zhí)行代碼。

2.更強的安全性

多個用戶和客戶端程序可以通過過程對基礎(chǔ)數(shù)據(jù)庫對象執(zhí)行操作,即使用戶和程序?qū)@些基礎(chǔ)對象沒有直接權(quán)限。 過程控制執(zhí)行哪些進程和活動,并且保護基礎(chǔ)數(shù)據(jù)庫對象。 這消除在了單獨的對象級別授予權(quán)限的要求,并且簡化了安全層。

3.更容易維護

在客戶端應(yīng)用程序調(diào)用過程并且將數(shù)據(jù)庫操作保持在數(shù)據(jù)層中時,對于基礎(chǔ)數(shù)據(jù)庫中的任何更改,只有過程是必須更新的。 應(yīng)用程序?qū)颖3知毩ⅲ⑶也槐刂缹?shù)據(jù)庫布局、關(guān)系或進程的任何更改的情況。

4.改進的性能

默認情況下,在首次執(zhí)行過程時將編譯過程,并且創(chuàng)建一個執(zhí)行計劃,供以后的執(zhí)行重復(fù)使用。 因為查詢處理器不必創(chuàng)建新計劃,所以,它通常用更少的時間來處理過程。

5.減少了服務(wù)器/客戶端網(wǎng)絡(luò)流量

過程中的命令作為代碼的單個批處理執(zhí)行。 這可以顯著減少服務(wù)器和客戶端之間的網(wǎng)絡(luò)流量,因為只有對執(zhí)行過程的調(diào)用才會跨網(wǎng)絡(luò)發(fā)送。 如果沒有過程提供的代碼封裝,每個單獨的代碼行都不得不跨網(wǎng)絡(luò)發(fā)送。

可以類比成java中的基礎(chǔ)類庫。總之就是高性能、安全、復(fù)用、易維護。

存儲過程的類型:

1.用戶定義

用戶定義的過程可在用戶定義的數(shù)據(jù)庫中創(chuàng)建,或者在除了 Resource 數(shù)據(jù)庫之外的所有系統(tǒng)數(shù)據(jù)庫中創(chuàng)建。

2.臨時

臨時過程是用戶定義過程的一種形式。 臨時過程與永久過程相似,只是臨時過程存儲于 tempdb 中。

3.系統(tǒng)

系統(tǒng)過程是 SQL Server 隨附的。 它們物理上存儲在內(nèi)部隱藏的 Resource 數(shù)據(jù)庫中,但邏輯上出現(xiàn)在每個系統(tǒng)定義數(shù)據(jù)庫和用戶定義數(shù)據(jù)庫的 sys 架構(gòu)中。

4.擴展的用戶定義過程(DePRecated,將被CLR存儲過程替代,以后再專門開貼)

通過擴展的過程,可以使用 Java 之類的編程語言創(chuàng)建外部例程。 這些過程是 SQL Server 實例可以動態(tài)加載和運行的 DLL。

創(chuàng)建表(Sql Server 2005)
  1. 打開Microsoft SQL Server Management Studio
  2. 建表表Sql語句:
CREATE TABLE [user](userId int,userName NVARCHAR[20],passWord NVARCHAR[20]);

  3. 再隨便填入一些數(shù)據(jù)。

  4. 打開查詢分析器,創(chuàng)建存儲過程,如圖。

使用存儲過程:

先來看一個簡單的存儲過程定義(我個人認為先看實例,再看語法是最好的學(xué)習(xí)方式,因為一開始上來就看語法,會讓人摸不著北):

1.不帶參數(shù)

存儲過程Name = select_del,獲取user表中的全部記錄。

1 CREATE PROCEDURE proc_select_user2 AS3     BEGIN4         SELECT * FROM [user]5     END6 GO

執(zhí)行:

EXECUTE proc_select_user;
2.帶輸入?yún)?shù)

存儲過程Name = proc_find_by_id_range,獲取user表中Id在給定范圍內(nèi)的所有記錄。

1 CREATE PROCEDURE proc_find_by_id_range(@startId INT, @endId INT)2 AS3     BEGIN4         SELECT * FROM [user] WHERE userId BETWEEN @startId AND @endId5     END6 GO 

執(zhí)行:

EXECUTE proc_find_by_id_range @startId = 10000,@endId = 10100;

3.帶輸入輸出參數(shù)

存儲過程Name = proc_find_userName_by_id,通過id獲取userName。

 1 CREATE PROCEDURE proc_find_userName_by_id 2    @userId INT, 3    @userName NVARCHAR(20) OUTPUT 4 AS 5     BEGIN 6         SELECT @userName = userName 7         FROM [user] 8         WHERE userId = @userId 9     END10 GO

執(zhí)行:

1 DECLARE @userName NVARCHAR(20);2 EXECUTE proc_find_userName_by_id 10004,@userName OUTPUT;(這邊如果用@變量 = OUTPUT會報錯,所以換一種寫法)3 SELECT @userName as 'result';
4.帶返回狀態(tài)

存儲過程Name = proc_check_password_isnull,查詢某Id的用戶是否設(shè)了密碼。

 1 CREATE PROCEDURE proc_check_password_isnull 2 @userId int 3 AS 4 BEGIN 5 IF(select password FROM [user] 6      WHERE userId = @userId) = null 7      RETURN 0 8 ELSE 9      RETURN 110 END11 GO

執(zhí)行:

1 DECLARE @status int;2 EXECUTE @status = proc_check_password_isnull @userId = 10000;3 SELECT @status as 'result';

通過上面幾個例子基本上也能明白存儲過程的用法了,下面再給出存儲過程語法的定義:

 1 --SQL Server Stored Procedure Syntax 2 CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] 3  4     [ { @parameter [ type_schema_name. ] data_type } 5         [ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY] 6     ] [ ,...n ] 7  8 [ WITH <procedure_option> [ ,...n ] ] 9 [ FOR REPLICATION ]10 11 AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }12 13 [;]14 15 <procedure_option> ::=16     [ ENCRYPTION ]17     [ RECOMPILE ]18     [ EXECUTE AS Clause ]

其中大部分關(guān)鍵字都在上面的四個例子中出現(xiàn)過,也比較好理解,下面再解釋一些沒展示過的關(guān)鍵字:

1 [ WITH <procedure_option> [ ,...n ] ]2 <procedure_option> ::=3     [ ENCRYPTION ]4     [ RECOMPILE ]5     [ EXECUTE AS Clause ]

這個是可以為存儲過程定義一些特性,ENCRYPTION是可以為存儲過程加密,RECOMPILE是不緩存,每次調(diào)用存儲過程需要重新編譯,EXECUTE AS Clause是否作為語句塊執(zhí)行。

[ FOR REPLICATION ]

指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲過程。.使用 FOR REPLICATION 選項創(chuàng)建的存儲過程可用作存儲過程篩選,且只能在復(fù)制過程中執(zhí)行。本選項不能和 WITH RECOMPILE 選項一起使用。

ELSE

其實每個數(shù)據(jù)庫都有很多系統(tǒng)定義的存儲過程,如user表中的存儲過程:

如果有興趣可以去研究下系統(tǒng)的存儲過程,既可以熟練存儲過程的使用,也能對數(shù)據(jù)庫里面的機制理解的更深。

其實存儲過程中還有很多用法沒有介紹,如通配符、CLR、以及游標。以后如有時間再深入研究。有不對的地方,請大家指正:)


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 垣曲县| 从江县| 普宁市| 湟中县| 刚察县| 高清| 桃园市| 汾西县| 延安市| 甘南县| 万山特区| 沿河| 富锦市| 通山县| 吴堡县| 建德市| 梨树县| 泰安市| 巴彦淖尔市| 海口市| 含山县| 高淳县| 高邮市| 油尖旺区| 桐庐县| 万宁市| 乌海市| 新野县| 鸡泽县| 高安市| 赤水市| 怀来县| 寿光市| 舒城县| 永安市| 台江县| 关岭| 锡林郭勒盟| 普兰县| 铁力市| 大厂|