SQL Server如何創(chuàng)建存儲(chǔ)過(guò)程
??存儲(chǔ)過(guò)程: 可以理解為完成特定功能的一組 SQL
語(yǔ)句集,存儲(chǔ)在數(shù)據(jù)庫(kù)中,經(jīng)過(guò)第一次編譯,之后的運(yùn)行不需要再次編譯,用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)調(diào)用存儲(chǔ)過(guò)程。
如何創(chuàng)建存儲(chǔ)過(guò)程
??創(chuàng)建存儲(chǔ)過(guò)程可以有兩種方式:一是在 SSMS
中界面操作創(chuàng)建存儲(chǔ)過(guò)程,而后修改其中的 SQL
語(yǔ)句及存儲(chǔ)過(guò)程名稱(chēng);二是通過(guò)命令行直接編寫(xiě)創(chuàng)建存儲(chǔ)過(guò)程。
??在操作之前,得要有一個(gè)數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)中將要使用存儲(chǔ)過(guò)程查詢(xún)或操作的數(shù)據(jù)表,這里以 MyDBDemo
數(shù)據(jù)庫(kù)為例,其中有一個(gè) sys_user
的用戶數(shù)據(jù)表。
??1、SSMS
界面創(chuàng)建存儲(chǔ)過(guò)程:
??界面鼠標(biāo)操作創(chuàng)建存儲(chǔ)過(guò)程方便快捷,一些基礎(chǔ)的腳本不需要手動(dòng)編寫(xiě),由 SSMS
自動(dòng)生成。
??步驟: 展開(kāi)數(shù)據(jù)庫(kù)中的【可編程性】,在【存儲(chǔ)過(guò)程】上鼠標(biāo)單擊右鍵出現(xiàn)彈出菜單,點(diǎn)擊【存儲(chǔ)過(guò)程】即可彈出新的查詢(xún)窗口,里面有一些默認(rèn)的 SQL
腳本。
??軟件自動(dòng)生成的存儲(chǔ)過(guò)程創(chuàng)建腳本,現(xiàn)在可以基于此修改存儲(chǔ)過(guò)程中的內(nèi)容了。
??說(shuō)明: 從 第 1 行到 20 行不需要關(guān)注,這些都是一些設(shè)置和注釋說(shuō)明,第 21 行到 33 行才是存儲(chǔ)過(guò)程的主要內(nèi)容。下面將通過(guò)代碼逐行介紹這些命令。
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> -- 這一行表示存儲(chǔ)過(guò)程的名稱(chēng), '<>' 是占位符,將其替換為存儲(chǔ)過(guò)程的名稱(chēng)
-- 以下列出存儲(chǔ)過(guò)程的參數(shù)以及返回參數(shù),這是設(shè)置存儲(chǔ)過(guò)程有哪些參數(shù)和返回什么數(shù)據(jù)
<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN -- 從這里開(kāi)始就是存儲(chǔ)過(guò)程的主體部分
-- 這里面的內(nèi)容就是 SQL 語(yǔ)句集,可以放置許多的 SQL 增刪查改等操作腳本
END -- 這里結(jié)束存儲(chǔ)過(guò)程,表示存儲(chǔ)過(guò)程的 SQL 集在這里結(jié)束
??2、SQL
腳本創(chuàng)建存儲(chǔ)過(guò)程:
??腳本創(chuàng)建存儲(chǔ)過(guò)程就是自行編寫(xiě)基礎(chǔ)的創(chuàng)建存儲(chǔ)過(guò)程的語(yǔ)句,如上所示代碼中的內(nèi)容都是自行手動(dòng)編寫(xiě),然后執(zhí)行腳本即可創(chuàng)建好這個(gè)存儲(chǔ)過(guò)程。
??如下創(chuàng)建存儲(chǔ)過(guò)程的腳本,是傳入用戶的數(shù)據(jù)參數(shù),插入到數(shù)據(jù)庫(kù)中,而后再查詢(xún)出來(lái)展示,詳細(xì)講解請(qǐng)看注釋?zhuān)?code>SQL 腳本如下所示:
CREATE PROCEDURE InsertUser -- 這里存儲(chǔ)過(guò)程的名稱(chēng)為‘InsertUser’
-- 輸入?yún)?shù)有userno、pwd、username、role、email,輸出參數(shù)有 count
-- 輸入輸出參數(shù)的名稱(chēng)前面必須加上 ‘@’ ,表示其是一個(gè)變量。
@userno nvarchar(50), --輸入?yún)?shù),用戶編碼
@pwd nvarchar(50), -- 輸入?yún)?shù),登錄密碼
@username nvarchar(50), -- 輸入?yún)?shù),用戶姓名
@email nvarchar(50), -- 輸入?yún)?shù),用戶郵箱
@count int output-- 輸出參數(shù),當(dāng)前數(shù)據(jù)表中的總數(shù)據(jù)條數(shù),這里輸出參數(shù)采用 ‘output’ 標(biāo)識(shí)
AS
BEGIN -- 從這里開(kāi)始就是存儲(chǔ)過(guò)程的主體部分
-- 這里插入一條數(shù)據(jù)到數(shù)據(jù)表中,數(shù)據(jù)內(nèi)容來(lái)源于存儲(chǔ)過(guò)程中傳入的內(nèi)容,其中用戶角色字段 ‘[role]’ 設(shè)置默認(rèn)值為 ‘a(chǎn)dmin’
INSERT INTO [dbo].[sys_user] ([userno],[pwd],[username],[role],[email])
VALUES (@userno,@pwd,@username,'admin',@email);
-- 查詢(xún)出數(shù)據(jù)表
select * from [dbo].[sys_user];
-- 返回值總條數(shù)查詢(xún)
select @count = @@ROWCOUNT;
END -- 這里結(jié)束存儲(chǔ)過(guò)程,表示存儲(chǔ)過(guò)程的 SQL 集在這里結(jié)束
存儲(chǔ)過(guò)程的使用或調(diào)用
??存儲(chǔ)過(guò)程的使用需要采用關(guān)鍵字 EXEC
加上存儲(chǔ)過(guò)程名稱(chēng),而后跟隨參數(shù)的方式。
DECLARE @pdCount INT; -- 定義返回值參數(shù)
-- 通過(guò) exec <存儲(chǔ)過(guò)程名稱(chēng)> <參數(shù)列表> 調(diào)用存儲(chǔ)過(guò)程
exec [dbo].[InsertUser] @userno='user-1',@pwd='123',@username='wanger',@email='123@abccom',@count=@pdCount output
select @pdCount as '數(shù)據(jù)表總數(shù)' -- 查詢(xún)出返回值中的內(nèi)容
??執(zhí)行結(jié)果如下所示:
存儲(chǔ)過(guò)程的意義
??優(yōu)點(diǎn):
??1、存儲(chǔ)過(guò)程加快系統(tǒng)運(yùn)行速度,存儲(chǔ)過(guò)程只在創(chuàng)建時(shí)編譯,以后每次執(zhí)行時(shí)不需要重新編譯。
??2、存儲(chǔ)過(guò)程可以封裝復(fù)雜的數(shù)據(jù)庫(kù)操作,簡(jiǎn)化操作流程,例如對(duì)多個(gè)表的更新,刪除等。
??3、可實(shí)現(xiàn)模塊化的程序設(shè)計(jì),存儲(chǔ)過(guò)程可以多次調(diào)用,提供統(tǒng)一的數(shù)據(jù)庫(kù)訪問(wèn)接口,改進(jìn)應(yīng)用程序的可維護(hù)性。
??4、存儲(chǔ)過(guò)程可以增加代碼的安全性,對(duì)于用戶不能直接操作存儲(chǔ)過(guò)程中引用的對(duì)象,SQL Server可以設(shè)定用戶對(duì)指定存儲(chǔ)過(guò)程的執(zhí)行權(quán)限。
??5、存儲(chǔ)過(guò)程可以降低網(wǎng)絡(luò)流量,存儲(chǔ)過(guò)程代碼直接存儲(chǔ)于數(shù)據(jù)庫(kù)中,在客戶端與服務(wù)器的通信過(guò)程中,不會(huì)產(chǎn)生大量的T_SQL代碼流量。
??缺點(diǎn):
??1、數(shù)據(jù)庫(kù)移植不方便,存儲(chǔ)過(guò)程依賴(lài)與數(shù)據(jù)庫(kù)管理系統(tǒng), SQL Server 存儲(chǔ)過(guò)程中封裝的操作代碼不能直接移植到其他的數(shù)據(jù)庫(kù)管理系統(tǒng)中。
??2、不支持面向?qū)ο蟮脑O(shè)計(jì),無(wú)法采用面向?qū)ο蟮姆绞綄⑦壿嫎I(yè)務(wù)進(jìn)行封裝,甚至形成通用的可支持服務(wù)的業(yè)務(wù)邏輯框架。
??3、代碼可讀性差,不易維護(hù)。不支持集群。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-729703.html
結(jié)語(yǔ)
??為什么需要存儲(chǔ)過(guò)程:效率高、降低網(wǎng)絡(luò)流量、復(fù)用性高、可維護(hù)性高、安全性高。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729703.html
到了這里,關(guān)于SQL server 創(chuàng)建存儲(chǔ)過(guò)程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!