SQL Server儲存過程 -九五小龐
一、儲存過程的概念
儲存過程是指為了完成特定的功能由一條或多條sql語句組成的集合,這些語句集合可以被多次呼叫,類似於批處理檔案,通常指定一個名稱進行儲存,經系統進行編譯後儲存到資料庫的伺服器中,作為資料庫的物件,形成一個處理單元。儲存過程建立之後,使用者通過指定儲存過程名稱與引數,呼叫該儲存過程並且執行。在呼叫的過程中允許使用者宣告變數,設定條件,以便增強程式設計的能力。
二、儲存過程的優點
儲存過程加快系統執行速度,儲存過程只在建立時編譯,以後每次執行時不需要重新編譯。
儲存過程可以封裝複雜的資料庫操作,簡化操作流程,例如對多個表的更新,刪除等。
可實現模組化的程式設計,儲存過程可以多次呼叫,提供統一的資料庫訪問介面,改進應用程式的可維護性。
儲存過程可以增加程式碼的安全性,對於使用者不能直接操作儲存過程中引用的物件,SQL Server可以設定使用者對指定儲存過程的執行許可權。
儲存過程可以降低網路流量,儲存過程程式碼直接儲存於資料庫中,在客戶端與伺服器的通訊過程中,不會產生大量的T_SQL程式碼流量。
三、儲存過程的缺點
儲存過程影響到資料庫的移植,因為儲存過程依賴於資料庫管理系統,在儲存過程中所封裝的t-sql程式碼不能直接移植到其他資料庫管理系統中。
對叢集操作不支援。
不支援面向物件的程式設計無法面對的方式封裝業務邏輯。
儲存過程的程式碼不易閱讀,維護難度大。
四、儲存過程的分類
1、系統儲存過程
該類儲存過程通常被存放到master資料庫中,儲存過程名稱通常以“sp_”為字首,但是在其他資料庫中均可呼叫系統儲存過程,呼叫時在儲存過程名稱前面不必新增資料庫的限定名。其功能是在表中獲取資訊,實現資料庫伺服器的管理任務。
2、使用者自定義儲存過程
所謂自定義儲存過程,是指為了完成某一段特定的功能需求,在使用者資料庫中利用t-sql自行編輯的語句集合,在使用者自定義的過程中可以有輸入引數,返回的輸出引數及返回至客戶端的資訊與結果 。如果在儲存過程名稱前加了“##”符號,表示建立的儲存過程是臨時的全域性性的;如果前面的為“#”符號,表示所建立的儲存過程是臨時的區域性的,該儲存過程只能在建立它的會話中使用。以上兩種儲存過程建立後都存放在tempdb資料庫中。
3、擴充套件儲存過程
擴充套件儲存過程是以在SQL SERVER環境外執行的動態連線(DLL檔案)來實現的,可以載入到SQL SERVER例項執行的地址空間中執行,擴充套件儲存過程可以用SQL SERVER擴充套件儲存過程API程式設計,擴充套件儲存過程以字首"xp_"來標識,對於使用者來說,擴充套件儲存過程和普通話儲存過程一樣,可以用相同的方法來執行。
五、建立儲存過程
--建立學生表 create table student( student_id int identity(1,1) primary key, student_name varchar(10), student_ageint, student_sex varchar(2) ); --插入學生資料 insert into books (student_name,student_age,student_sex) values ('張三',23,'男'), ('李四',18,'女'), ('王五',32,'男')
1、建立無參儲存過程
--建立無參儲存過程 if object_id('getAllstu','p') is not null drop proc getAllstu go create proc getAllstu --prco全寫:procedure as select * from student go --呼叫,執行儲存過程 exec getAllstu
2、修改儲存過程
alter proc getAllstu as select name,age from student go
3、 重新命名儲存過程
sp_rename getAllstu,getSomestu
4、 刪除儲存過程
drop proc getSomestu
5、建立帶引數的儲存過程
儲存過程的引數分為兩種:輸入引數和輸出引數
輸入引數:用於向儲存過程傳入值,類似java語言中的值傳遞。
輸出引數:用於呼叫儲存過程後,參會結果,類似java語言的按引用傳遞。
值傳遞和引用傳遞區別:
- 基本資料型別賦值屬於值傳遞;引用型別之間賦值屬於引用傳遞。
- 值傳遞時傳遞的是實實在在的變數值;引用傳遞時傳遞的是物件的引用地址。
- 值傳遞後,兩個變數改變的是各自的值;引用傳遞後,兩個引用改變的是同一個物件的狀態。
5.1、帶一個引數儲存過程
if object_id('searchStu','p') is not null drop proc searchStu go create proc searchStu(@stuID int) as --要求student_id列與輸入引數相等 select * from student where student_id=@stuID go --執行searchStu exec searchStu 1
5.2、帶二個引數儲存過程
if object_id('searchStus','p') is not null drop proc searchStus go create proc searchStus( @stuID int, @stu_name varchar(10)) as --要求stuID和stu_name列與輸入引數相等 select * from student where student_id=@stuID and student_name=@stu_name go --執行searchStus exec searchStus 2,'王五'
5.3、有返回值的儲存過程
if object_id('getStuId','p') is not null drop proc getStuId go create proc getStuId( @stu_Name varchar(10),--輸入引數,無預設值 @stuId int output --輸入/輸出引數 無預設值 ) as select @stuId=student_id from student where student_name=@stu_Name go --執行getStuId這個帶返回值的儲存過程 declare @id int --宣告一個變數用來接收執行儲存過程後的返回值 exec getStuId '張三',@id output select @id as stuId;--as是給返回的列值起一個名字
5.4、有預設值的儲存過程
if object_id('getStuId','p') is not null drop proc getStuId go create proc getStuId( @stu_Name varchar(10)='李四',--輸入引數,有預設值 @stuId int output --輸入/輸出引數 無預設值 ) as select @stuId=student_id from student where student_name=@stu_Name go --執行getStuId這個帶返回值的儲存過程 declare @id int --宣告一個變數用來接收執行儲存過程後的返回值 exec getStuId default,@id output select @id as stuId;--as是給返回的列值起一個名字
5.5、帶萬用字元的儲存過程
if object_id('charStu','p') is not null drop proc charStu go create proc charStu( @stu_Name varchar(10)='張%' ) as select * from student where student_name like @stu_Name go --執行儲存過程charStu exec charStu '王%'
————————————————
版權宣告:本文為CSDN博主「何極光」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_44034384/article/details/106236823