1. 程式人生 > 其它 >SQL Server儲存過程 -九五小龐

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_age 
int, 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