概述
存儲過程是一組預編譯的SQL語句,其優點是允許模塊化設計,也就是說只需創建一次,以後在程序中就可以多次調用,如果某次操作需要執行多條SQL語句,那麼使用存儲過程比單純的執行SQL語句的速度要快
如果有C#或者Java等語言基礎的同學可以將存儲過程理解爲那些編程語言裏的方法
SQL Serve存儲過程主要分爲:
- 無參存儲過程
- 有參存儲過程
- 有參有輸出存儲過程
在SQL Server數據庫裏系統也自帶了許多存儲過程,本文主要講述的是用戶自定義存儲過程。
創建存儲過程
無參存儲過程
創建無參存儲過程的語法
create proc cp_select_book
as
select * from [dbo].[Books]
語法解析:
create proc(proc是創建存儲過程的關鍵字) 存儲過程名
as
需要執行的操作
調用無參存儲過程
exec cp_select_book
使用exec關鍵字後面加上存儲過程名調用存儲過程
有參存儲過程
創建有參存儲過程很簡單,和無參的類似,只不過是在定義的時候存儲過程名後面要跟上一對小括號裏面定義參數
create proc cp_select_book
(
@name nvarchar(50)
)
as
select * from [dbo].[Books]
where name = @name
這裏創建有參存儲過程的時候,是變量名在前,變量類型在後,記得不要搞返了,如果有多個參數則以逗號 ‘,’ 分開
調用存儲過程
exec cp_select_book '我是有參存儲過程'
調用的時候加上對應類型的參數就ok了,調用的時候就不用()小括號,多個參數也是逗號分開
有參有輸出存儲過程
所謂有輸出的存儲過程就是把變量傳遞給這個存儲過程之後,經過處理可以改變這個變量的值
模擬場景:當我按條件查詢一個表的信息的時候並且需要得到他所有的記錄條數,這個時候就要用到有輸出的存儲過程了
create proc cp_select_booke_byNameExt
(
@name varchar(20),
--out關鍵字就代表這是輸出參數
@recorRows int out
)
as
select * from [dbo].[Books] where name like '%'+@name+'%'
--計算總記錄數
select @recorRows=COUNT(*) from [dbo].[Books] where name like '%'+@name+'%'
如果參數是輸出參數的話,則只要在定義形參的時候在後面加上out 關鍵字
調用有參有輸出存儲過程
--定義一個變量用來接收返回參數
declare @recorRows int
--傳入參數的時候也要加上out關鍵字
exec cp_select_booke_byNameExt 'vue',@recorRows out
--打印出總記錄數
print @recorRows
--查詢books表所有數據,用來做區分
select * from [dbo].[Books]
執行結果:
可以看到符合條件的數據只有一條,那麼問題來了,我要的顯示符合總記錄是應該是一個數字,但是他沒顯示出來??
其實當我們使用了print打印出來的數據都在“消息”這個選項卡里
可以看到確實是一條記錄
存儲過程完成分頁功能
在日常開發中,分頁是經常要用到的,如果我們一次性把數據庫裏的數據全部查詢出來的話,數據少的時候可能感受不出來,但數據達到上萬條甚至更多的話,查詢時間就會很長,這也就意味着用戶需要等待一段時間才能看到內容,所以對用戶體驗不太友好。這個時候就要用到分頁功能,按量顯示數據,這樣系統執行速度也會相對較快
分頁例子
create proc cp_select_booke_paging
(
@name nvarchar(50),--按照名稱來查詢
@pageIndex int,--第幾頁
@pageSize int,--每頁顯示數量
@totalCount int --所有頁面的總記錄數
)
as
select top (@pageSize) * from [dbo].[Books]
where name like '%'+@name+'%' and id not in (select top ((@pageIndex-1)*@pageSize) ID
from [dbo].[Books] order by ID)
order by ID
--查詢總記錄數
select @totalCount=COUNT(*) from [dbo].[Books] where name like '%'+@name+'%'
調用
select * from [dbo].[Books]
declare @totalCount int
--查詢第一頁並且每頁顯示兩條內容
exec cp_select_booke_paging '',1,2,@totalCount
print @totalCount
查詢結果:
再來看看第二頁的數據是否正確,第二頁應該顯示“西遊記”和“紅樓夢”這兩條數據
按照預期的執行,分頁完成。SQL Server分頁的方法也有很多種,網上也有很多教程這裏只介紹一種,不多過概述分頁。
存儲過程所在位置
我們上面創建了那麼多個存儲過程,那麼在哪裏可以看到我們創建的存儲過程呢?
數據庫展開>可編程性>存儲過程
我們在數據庫定義的所有存儲過程都會在這個位置找到
刪除存儲過程
drop proc cp_select_book
使用 drop proc 關鍵字加上存儲過程名來刪除存儲過程