SQL?server創(chuàng)建存儲(chǔ)過(guò)程詳細(xì)圖文教程
前言
存儲(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ò)程名稱;二是通過(guò)命令行直接編寫(xiě)創(chuàng)建存儲(chǔ)過(guò)程。
在操作之前,得要有一個(gè)數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)中將要使用存儲(chǔ)過(guò)程查詢或操作的數(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ò)程】即可彈出新的查詢窗口,里面有一些默認(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ǔ)過(guò)程的名稱 -- 以下列出存儲(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ù)中,而后再查詢出來(lái)展示,詳細(xì)講解請(qǐng)看注釋,SQL
腳本如下所示:
CREATE PROCEDURE InsertUser -- 這里存儲(chǔ)過(guò)程的名稱為‘InsertUser' -- 輸入?yún)?shù)有userno、pwd、username、role、email,輸出參數(shù)有 count -- 輸入輸出參數(shù)的名稱前面必須加上 ‘@' ,表示其是一個(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); -- 查詢出數(shù)據(jù)表 select * from [dbo].[sys_user]; -- 返回值總條數(shù)查詢 select @count = @@ROWCOUNT; END -- 這里結(jié)束存儲(chǔ)過(guò)程,表示存儲(chǔ)過(guò)程的 SQL 集在這里結(jié)束
存儲(chǔ)過(guò)程的使用或調(diào)用
存儲(chǔ)過(guò)程的使用需要采用關(guān)鍵字 EXEC
加上存儲(chǔ)過(guò)程名稱,而后跟隨參數(shù)的方式。
DECLARE @pdCount INT; -- 定義返回值參數(shù) -- 通過(guò) exec <存儲(chǔ)過(guò)程名稱> <參數(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ù)' -- 查詢出返回值中的內(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ò)程依賴與數(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ù)。不支持集群。
結(jié)語(yǔ)
為什么需要存儲(chǔ)過(guò)程:效率高、降低網(wǎng)絡(luò)流量、復(fù)用性高、可維護(hù)性高、安全性高。
到此這篇關(guān)于SQL server創(chuàng)建存儲(chǔ)過(guò)程的文章就介紹到這了,更多相關(guān)SQL server創(chuàng)建存儲(chǔ)過(guò)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqlserver合并DataTable并排除重復(fù)數(shù)據(jù)的通用方法分享
網(wǎng)上合并DataTable通用方法的文章很多,結(jié)合項(xiàng)目開(kāi)發(fā)中的常用需求,并借鑒網(wǎng)上的做法,寫(xiě)了一個(gè)合并DataTable的通用方法,主要功能是合并兩個(gè)DataTable(結(jié)構(gòu)可以不同,如字段不完全一致),并可以根據(jù)某一列值進(jìn)行排重處理2011-12-12CASE表達(dá)式實(shí)現(xiàn)基于條件邏輯來(lái)返回一個(gè)值
針對(duì)一列,基于條件邏輯來(lái)返回一個(gè)值,那么,這時(shí)候就需要使用到CASE表達(dá)式了,下面是具體的應(yīng)用2014-07-07sqlserver 2000中每個(gè)服務(wù)器角色的解釋
sqlserver 2000中每個(gè)服務(wù)器角色的解釋,方便大家以后對(duì)于數(shù)據(jù)庫(kù)權(quán)限有所了解。2011-03-03SQLServer獲取臨時(shí)表所有列名或是否存在指定列名的方法
本文介紹了SQLServer獲取臨時(shí)表所有列名或是否存在指定列名的方法,需要的朋友一起來(lái)看下吧2016-12-12利用 SQL Server 過(guò)濾索引提高查詢語(yǔ)句的性能分析
本文就給大家介紹一下 Microsoft SQL Server 中的過(guò)濾索引功能,本文通過(guò)場(chǎng)景模擬分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07SQL Server數(shù)據(jù)庫(kù)重命名、數(shù)據(jù)導(dǎo)出的方法說(shuō)明
這篇文章主要介紹了SQL Server數(shù)據(jù)庫(kù)重命名、數(shù)據(jù)導(dǎo)出、更改數(shù)據(jù)庫(kù)所有者的方法說(shuō)明,大家參考使用吧2013-11-11