
但也不是說學不會,今天就給大家好好惡補一下存儲過程的一些常規(guī)用法,一些非常規(guī)用法實在是太多了,這里就不一一列舉了。
作者:丶平凡世界
來源: SQL數(shù)據(jù)庫開發(fā)
創(chuàng)建存儲過程
create proc | procedure procedure_name
[{@參數(shù)數(shù)據(jù)類型} [=默認值] [output],
{@參數(shù)數(shù)據(jù)類型} [=默認值] [output],
....
]
as
SQL_statements
go
示例
create proc sp_test
@param1 int,
@param2 varchar(16) as select * from test where id=@param1 and t_no=@param2;
go
上面就是一個簡單的示例。
存儲過程在創(chuàng)建階段可以帶參數(shù)或不帶參數(shù),不帶參數(shù)的一般是執(zhí)行一些不需要傳遞參數(shù)的語句就可以完成的功能,帶參數(shù)那就是需要傳遞參數(shù)的SQL語句,就像上面的示例,傳遞了兩個參數(shù)給SQL語句。帶參數(shù)的一定要定義參數(shù)類型,是字符型的還要定義長度,給參數(shù)加默認值是可選的。
存儲過程的優(yōu)點和缺點
優(yōu)點:
1、提高性能
SQL語句在創(chuàng)建過程時進行分析和編譯。存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優(yōu)化器對其進行分析、優(yōu)化,并給出最終被存在系統(tǒng)表中的存儲計劃,這樣,在執(zhí)行過程時便可節(jié)省此開銷。
2、降低網(wǎng)絡(luò)開銷
存儲過程調(diào)用時只需用提供存儲過程名和必要的參數(shù)信息,從而可降低網(wǎng)絡(luò)的流量。
3、便于進行代碼移植
數(shù)據(jù)庫專業(yè)人員可以隨時對存儲過程進行修改,但對應用程序源代碼卻毫無影響,從而極大的提高了程序的可移植性。
4、更強的安全性
1)系統(tǒng)管理員可以對執(zhí)行的某一個存儲過程進行權(quán)限限制,避免非授權(quán)用戶對數(shù)據(jù)的訪問
2)在通過網(wǎng)絡(luò)調(diào)用過程時,只有對執(zhí)行過程的調(diào)用是可見的。因此,惡意用戶無法看到表和數(shù)據(jù)庫對象名稱、嵌入自己的 Transact-SQL 語句或搜索關(guān)鍵數(shù)據(jù)。
3)使用過程參數(shù)有助于避免 SQL 注入攻擊。因為參數(shù)輸入被視作文字值而非可執(zhí)行代碼,所以,攻擊者將命令插入過程內(nèi)的 Transact-SQL 語句并損害安全性將更為困難。
4)可以對過程進行加密,這有助于對源代碼進行模糊處理。
劣勢:
1、邏輯處理吃力
SQL本身是一種結(jié)構(gòu)化查詢語言,但不是面向?qū)ο蟮牡?,本質(zhì)上還是過程化的語言,面對復雜的業(yè)務邏輯,過程化的處理會很吃力。同時SQL擅長的是數(shù)據(jù)查詢而非業(yè)務邏輯的處理,如果如果把業(yè)務邏輯全放在存儲過程里面,違背了這一原則。
2、修改參數(shù)復雜
如果需要對輸入存儲過程的參數(shù)進行更改,或者要更改由其返回的數(shù)據(jù),則您仍需要更新程序集中的代碼以添加參數(shù)、更新調(diào)用,等等,這時候估計會比較繁瑣了。
3、開發(fā)調(diào)試復雜
由于IDE的問題,存儲過程的開發(fā)調(diào)試要比一般程序困難。
4、無法應用緩存
雖然有全局臨時表之類的方法可以做緩存,但同樣加重了數(shù)據(jù)庫的負擔。如果緩存并發(fā)嚴重,經(jīng)常要加鎖,那效率實在堪憂。
5、不支持群集
數(shù)據(jù)庫服務器無法水平擴展,或者數(shù)據(jù)庫的切割(水平或垂直切割)。數(shù)據(jù)庫切割之后,存儲過程并不清楚數(shù)據(jù)存儲在哪個數(shù)據(jù)庫中。
存儲過程的具體應用
基礎(chǔ)應用
1、創(chuàng)建不帶參數(shù)的存儲過程
示例:查詢訂單表中訂單總數(shù)
--查詢存儲過程 IF OBJECT_ID (N'PROC_ORDER_COUNT', N'P') IS NOT NULL
DROP procedure PROC_ORDER_COUNT;
GO CREATE procedure PROC_ORDER_COUNT AS
SELECT COUNT(OrderID) FROM Orders;
GO --執(zhí)行上述存儲過程: EXEC PROC_ORDER_COUNT;
2、創(chuàng)建帶參數(shù)的存儲過程
示例:根據(jù)城市查詢訂單數(shù)量
--查詢存儲過程,根據(jù)城市查詢總數(shù) IF OBJECT_ID (N'PROC_ORDER_COUNT', N'P') IS NOT NULL
DROP procedure PROC_ORDER_COUNT;
GO CREATE procedure PROC_ORDER_COUNT(@city nvarchar(50)) AS SELECT COUNT(OrderID) FROM Orders WHERE City=@city GO --執(zhí)行上述存儲過程: EXEC PROC_ORDER_COUNT N'GuangZhou';
進階應用
3、參數(shù)帶通配符
--查詢訂單編號頭兩位是LJ的訂單信息,含通配符 IF OBJECT_ID (N'PROC_ORDER_INFO', N'P') IS NOT NULL
DROP procedure PROC_ORDER_INFO;
GO CREATE procedure PROC_ORDER_INFO
@OrderID nvarchar(50)='LJ%' --默認值 AS
SELECT OrderID,City,OrderDate,Price FROM Orders
WHERE OrderID like @OrderID;
GO --執(zhí)行上述存儲過程: EXEC PROC_ORDER_INFO;
EXEC PROC_ORDER_INFO N'LJ%';
EXEC PROC_ORDER_INFO N'%LJ%';
4、帶輸出參數(shù)
--根據(jù)訂單查詢的信息,返回訂單的城市及單價 IF OBJECT_ID (N'PROC_ORDER_INFO ', N'P') IS NOT NULL
DROP procedure PROC_ORDER_INFO ;
GO CREATE procedure PROC_ORDER_INFO
@orderid nvarchar(50), --輸入?yún)?shù) @city nvarchar(20) out, --輸出參數(shù) @price float output --輸入輸出參數(shù) AS
SELECT @city=City,@price=Price FROM Orders
WHERE OrderID=@orderid AND Price=@price;
GO --執(zhí)行上述存儲過程: declare @orderid nvarchar(50),
@city nvarchar(20),
@price int; set @orderid= N'LJ0001'; set @price = 35.21;
exec PROC_ORDER_INFO @orderid,@city out, @price output; select @city, @price;
上面兩個在平時工作中遇到的較少,需要的時候知道怎么用即可,1,2個是必須掌握的操作。
存儲過程進行增刪改
1、新增
--新增訂單信息 IF OBJECT_ID (N'PROC_INSERT_ORDER', N'P') IS NOT NULL
DROP procedure PROC_INSERT_ORDER;
GO CREATE procedure PROC_INSERT_ORDER
@orderid nvarchar(50),
@city nvarchar(20),
@price float AS
INSERT INTO Orders(OrderID,City,Price)
VALUES(@orderid,@city,@price) GO --執(zhí)行 EXEC PROC_INSERT_ORDER N'LJ0001',N'GuangZhou',35.21;
2、修改
--修改訂單信息
IF OBJECT_ID (N'PROC_UPDATE_ORDER', N'P') IS NOT NULL
DROP procedure PROC_UPDATE_ORDER;
GO
CREATE procedure PROC_UPDATE_ORDER
@orderid nvarchar(50),
@city nvarchar(20),
@price float
AS
UPDATE Orders SET OrderID=@orderid,City=@city,Price=@price;
GO
--執(zhí)行
EXEC PROC_UPDATE_ORDER N'LJ0001',N'ShangHai',37.21;
3、刪除
--修改訂單信息 IF OBJECT_ID (N'PROC_DELETE_ORDER', N'P') IS NOT NULL
DROP procedure PROC_DELETE_ORDER;
GO CREATE procedure PROC_DELETE_ORDER
@orderid nvarchar(50), AS
DELETE FROM Orders WHERE OrderID=@orderid;
GO --執(zhí)行 EXEC PROC_DELETE_ORDER N'LJ0001';
存儲過程其他功能
這部分是選修內(nèi)容,有興趣的可以了解一下
1、重復編譯存儲過程
--重復編譯 IF OBJECT_ID (N'PROC_ORDER_WITH_RECOMPILE', N'P') IS NOT NULL
DROP procedure PROC_ORDER_WITH_RECOMPILE;
GO CREATE procedure PROC_ORDER_WITH_RECOMPILE with recompile --重復編譯 AS
SELECT * FROM Orders;
GO
2、加密存儲過程
--查詢存儲過程,進行加密,加密后不能查看和修改源腳本 IF OBJECT_ID (N'PROC_ORDER_WITH_ENCRYPTION', N'P') IS NOT NULL
DROP procedure PROC_ORDER_WITH_ENCRYPTION;
GO CREATE procedure PROC_ORDER_WITH_ENCRYPTION with encryption --加密 AS
SELECT * FROM Orders;
GO --執(zhí)行上述存儲過程: EXEC PROC_ORDER_WITH_ENCRYPTION
執(zhí)行完的效果如圖:
以上就是存儲過程的詳細用法了。還有不明白或有疑問的地方,歡迎留言討論。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10