麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

存儲過程簡介

2024-07-21 02:52:17
字體:
來源:轉載
供稿:網友

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

優勢:

1、提高性能 SQL語句在創建過程時進行分析和編譯。 存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,并給出最終被存在系統表中的存儲計劃,這樣,在執行過程時便可節省此開銷。 2、降低網絡開銷 存儲過程調用時只需用提供存儲過程名和必要的參數信息,從而可降低網絡的流量。 3、便于進行代碼移植 數據庫專業人員可以隨時對存儲過程進行修改,但對應用程序源代碼卻毫無影響,從而極大的提高了程序的可移植性。 4、更強的安全性 1)系統管理員可以對執行的某一個存儲過程進行權限限制,避免非授權用戶對數據的訪問 2)在通過網絡調用過程時,只有對執行過程的調用是可見的。 因此,惡意用戶無法看到表和數據庫對象名稱、嵌入自己的 Transact-SQL 語句或搜索關鍵數據。 3)使用過程參數有助于避免 SQL 注入攻擊。 因為參數輸入被視作文字值而非可執行代碼,所以,攻擊者將命令插入過程內的 Transact-SQL 語句并損害安全性將更為困難。 4)可以對過程進行加密,這有助于對源代碼進行模糊處理。

劣勢:

1、存儲過程需要專門的數據庫開發人員進行維護,但實際情況是,往往由程序開發員人員兼職

2、設計邏輯變更,修改存儲過程沒有SQL靈活

--------------創建存儲過程-----------------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;1、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 中的加密注釋來重新創建加密過程。

10.FOR REPLICATION :指定不能在訂閱服務器上執行為復制創建的存儲過程。.使用 FOR REPLICATION 選項創建的存儲過程可用作存儲過程篩選,且只能在復制過程中執行。本選項不能和 WITH RECOMPILE 選項一起使用。

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

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

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

創建存儲過程

這里寫圖片描述 針對上面的表,我使用存儲過程對它做一些操作:

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

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountasselect * from UserAccountgo-------------執行上面的存儲過程----------------exec GetUserAccount

結果:相當于運行 select * from UserAccount 這行代碼,結果為整個表的數據。

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

-------------創建名為GetUserAccount的存儲過程----------------create Procedure inUserAccountasinsert 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 inUserAccountReasinsert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(10,10,'2013-01-02',10)return @@rowcountgo-------------執行上面的存儲過程----------------exec inUserAccountRe

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

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

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountRe@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000go-------------執行上面的存儲過程----------------exec GetUserAccountRe '7',null

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

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

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountRe1@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000return @@rowcountgo-------------執行上面的存儲過程----------------exec GetUserAccountRe1 '7',null

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

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

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountRe2@UserName nchar(20),@UserID int outputasif(@UserName>5)select @UserID=COUNT(*) from UserAccount where UserID>25elseset @UserID=1000select * from UserAccountreturn @@rowcountgo-------------執行上面的存儲過程----------------exec GetUserAccountRe2 '7',null

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

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

-------------創建名為GetUserAccount的存儲過程----------------create Procedure GetUserAccountRe3asselect * from UserAccountselect * from UserAccount where UserID>5go-------------執行上面的存儲過程----------------exec GetUserAccountRe3

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 午夜激情视频免费 | 毛片免费观看视频 | 国产精品美女久久久久久不卡 | 爱福利视频网 | 亚洲国产高清视频 | 色人阁五月天 | 国产va在线观看 | 最近中文字幕一区二区 | 91色综合综合热五月激情 | 欧美黄色大片免费观看 | 一级国产航空美女毛片内谢 | 青青草成人影视 | pornoⅹxxxxhd麻豆| 精品国产一区二区三区久久久蜜 | 久久国产精品区 | 黑人一区 | 一级免费观看 | 欧美一级精品 | 久久久精品视频国产 | 日韩激情 | 精品亚洲二区 | 91精品国产九九九久久久亚洲 | 国产精品视频专区 | 俄罗斯hdxxx| 久久免费视频1 | 九九热精品在线 | 成人毛片免费看 | 免费黄色大片网站 | 久久人人爽人人爽人人片av高清 | 成人免费网站在线观看视频 | 精品国产精品久久 | 欧美交在线 | 欧美视频一区二区三区四区 | 欧美色大成网站www永久男同 | 欧美日韩精品一区二区三区蜜桃 | 久久精品电影网 | 日本黄色大片免费 | 久久爽久久爽久久av东京爽 | 欧美人与禽性xxxxx杂性 | 欧美视频一区二区三区在线观看 | 永久免费黄色大片 |