關(guān)于SQL 存儲(chǔ)過(guò)程入門(mén)基礎(chǔ)(基礎(chǔ)知識(shí))
大學(xué)里面對(duì)存儲(chǔ)過(guò)程沒(méi)有講到什么,工作了一段時(shí)間,對(duì)存儲(chǔ)過(guò)程還是沒(méi)有用到,根本不需要去寫(xiě)存儲(chǔ)過(guò)程,可能是做的軟件方向的原因吧。為了以后發(fā)展,決定從零開(kāi)始學(xué)習(xí)下。
這里看看存儲(chǔ)過(guò)程的定義,
存儲(chǔ)過(guò)程(Stored Procedure),是一組為了完成特定功能的SQL 語(yǔ)句,集經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù),如果該存儲(chǔ)過(guò)程帶有參數(shù)來(lái)執(zhí)行。
在SQL Server 的系列版本中,存儲(chǔ)過(guò)程分為兩類:系統(tǒng)提供的存儲(chǔ)過(guò)程和用戶自定義存儲(chǔ)過(guò)程。
系統(tǒng)SP,主要存儲(chǔ)master 數(shù)據(jù)庫(kù)中,并以sp_為前綴并且系統(tǒng)存儲(chǔ)過(guò)程主要是從系統(tǒng)表中獲取信息,從而為系統(tǒng)管理員管理SQL Server。
常用系統(tǒng)存儲(chǔ)過(guò)程有:
exec sp_databases; --查看數(shù)據(jù)庫(kù)
exec sp_tables; --查看表
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--約束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存儲(chǔ)過(guò)程創(chuàng)建、定義語(yǔ)句
exec sp_rename student, stuInfo;--修改表、索引、列的名稱
exec sp_renamedb myTempDB, myDB;--更改數(shù)據(jù)庫(kù)名稱
exec sp_defaultdb 'master', 'myDB';--更改登錄名的默認(rèn)數(shù)據(jù)庫(kù)
exec sp_helpdb;--數(shù)據(jù)庫(kù)幫助,查詢數(shù)據(jù)庫(kù)信息
exec sp_helpdb master;
用戶自定義存儲(chǔ)過(guò)程是由用戶創(chuàng)建,并能完成某一特定功能,如:查詢用戶所需數(shù)據(jù)信息的存儲(chǔ)過(guò)程。
這里我們看看存儲(chǔ)過(guò)程的好處;
(1)重復(fù)使用。存儲(chǔ)過(guò)程可以重復(fù)使用,從而可以減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。
(2)提高性能。存儲(chǔ)過(guò)程在創(chuàng)建的時(shí)候就進(jìn)行了編譯,將來(lái)使用的時(shí)候不用再重新編譯。一般的SQL語(yǔ)句每執(zhí)行一次就需要編譯一次,所以使用存儲(chǔ)過(guò)程提高了效率。
(3)減少網(wǎng)絡(luò)流量。存儲(chǔ)過(guò)程位于服務(wù)器上,調(diào)用的時(shí)候只需要傳遞存儲(chǔ)過(guò)程的名稱以及參數(shù)就可以了,因此降低了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量。
(4)安全性。參數(shù)化的存儲(chǔ)過(guò)程可以防止SQL注入式的攻擊,而且可以將Grant、Deny以及Revoke權(quán)限應(yīng)用于存儲(chǔ)過(guò)程。
好了,我們來(lái)看看創(chuàng)建的基本語(yǔ)法
定義存儲(chǔ)過(guò)程的語(yǔ)法
CREATE PROC[EDURE] 存儲(chǔ)過(guò)程名
@參數(shù)1 數(shù)據(jù)類型 = 默認(rèn)值,
…… ,
@參數(shù)n 數(shù)據(jù)類型 OUTPUT
AS
SQL語(yǔ)句
GO
,參數(shù)是可選的
,參數(shù)分為輸入?yún)?shù)、輸出參數(shù)
,輸入?yún)?shù)允許有默認(rèn)值
這里來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程
CREATE PROCEDURE UserLogin
@name varchar(20),
@password varchar(20)
AS
-- 定義一個(gè)臨時(shí)用來(lái)保存密碼的變量
--DECLARE @strPwd NVARCHAR(20) 這里先不介紹變量。稍后的文章會(huì)詳細(xì)講到
BEGIN
select * from userinfo where userName=@name and userPass=@password
END
GO
首先我們用簡(jiǎn)單的sql查詢
select * from userinfo where userName='admin'
查詢結(jié)果:
---------------------
UserName UserPass
Admin Admin
現(xiàn)在我們來(lái)執(zhí)行我們的存儲(chǔ)過(guò)程
exec UserLogin admin,admin
--或這樣調(diào)用:
EXEC UserLogin @name='admin',@password='admin'
查詢結(jié)果:
---------------------
UserName UserPass
Admin Admin
注意,在SQL SERVER中,所有用戶定義的變量都以“@”開(kāi)頭,OUTPUT關(guān)鍵字表示這個(gè)參數(shù)是用來(lái)輸出的,AS之后就是存儲(chǔ)過(guò)程內(nèi)容了。只要將以上代碼在“查詢分析器”里執(zhí)行一次,SQL SERVER就會(huì)在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)名為“UserLogin”的存儲(chǔ)過(guò)程。你可以打開(kāi)“企業(yè)管理器”,選擇當(dāng)前操作的數(shù)據(jù)庫(kù),然后在左邊的樹(shù)型列表中選擇"可編程性->存儲(chǔ)過(guò)程",此時(shí)就可以在右邊的列表中看到你剛剛創(chuàng)建的存儲(chǔ)過(guò)程了(如果沒(méi)有,刷新一下即可)。
看到了在數(shù)據(jù)中調(diào)用存儲(chǔ)過(guò)程的方法有兩種(這里EXEC與EXECUTE等效);
EXEC 過(guò)程名 參數(shù)值1,參數(shù)值2,....
或者
EXEC 參數(shù)1=參數(shù)值1,參數(shù)2=參數(shù)值2....
上面我們也看到了。
如果要?jiǎng)h除一個(gè)存儲(chǔ)過(guò)程,用drop
像這樣
drop PROCEDURE UserLogin
創(chuàng)建這樣的存儲(chǔ)過(guò)程有什么用呢,不是只能在數(shù)據(jù)中查看賽。
我們?cè)谧鰓eb或者winform 程序,假設(shè)需要個(gè)登錄,好,我們可以調(diào)用用這個(gè)存儲(chǔ)過(guò)程來(lái)登錄,根據(jù)傳入的參數(shù),如果查詢出來(lái)有記錄,那么這條記錄在數(shù)據(jù)庫(kù)中存在,表示登錄成功,否則失敗。
這樣做的目的更加安全,可以防止sql注入。
相關(guān)文章
sqlserver 存儲(chǔ)過(guò)程中If Else的用法實(shí)例
為大家介紹sql server存儲(chǔ)過(guò)程中if esle的用法,供大家學(xué)習(xí)參考。數(shù)據(jù)庫(kù)中有兩張表,A表主鍵為自動(dòng)增長(zhǎng)的并且是B表的外鍵且允許為空2013-08-08數(shù)據(jù)庫(kù)表的創(chuàng)建、管理和數(shù)據(jù)操作(實(shí)驗(yàn)一)
這篇文章主要介紹了數(shù)據(jù)庫(kù)中表的創(chuàng)建、管理和數(shù)據(jù)操作,感興趣的小伙伴可以參考一下2015-08-08通過(guò)T-SQL語(yǔ)句創(chuàng)建游標(biāo)與實(shí)現(xiàn)數(shù)據(jù)庫(kù)加解密功能
這篇文章介紹了通過(guò)T-SQL語(yǔ)句創(chuàng)建游標(biāo)與實(shí)現(xiàn)數(shù)據(jù)庫(kù)加解密功能的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03sql server 2016不能全部用到CPU的邏輯核心數(shù)的問(wèn)題
服務(wù)器總共CPU核心有72核,但sql 只能用到40核心,想信也有很多人遇到這問(wèn)題,那么今天這節(jié)就先說(shuō)說(shuō)這問(wèn)題是怎么出現(xiàn)的2023-05-05SQL中函數(shù) replace 的參數(shù)1的數(shù)據(jù)類型ntext無(wú)效的解決方法
SQL中函數(shù) replace 的參數(shù) 1 的數(shù)據(jù)類型 ntext 無(wú)效。找了半天找到了解決辦法2010-06-06sql 語(yǔ)句插入結(jié)果為select和值混合示例
這篇文章主要介紹了sql語(yǔ)句插入結(jié)果為select和值混合,需要的朋友可以參考下2014-05-05SQL Server中T-SQL 數(shù)據(jù)類型轉(zhuǎn)換詳解
T-SQL提供了兩個(gè)顯示轉(zhuǎn)換的函數(shù):CAST函數(shù)和CONVERT函數(shù)。今天我們就來(lái)相信探討下2018-02-02