SqlServer存儲過程的建立與使用

什麼是存儲過程?

T-SQL中的存儲過程,很是相似於net語言中的方法,它能夠重複調用。當存儲過程執行一次後,能夠將語句緩存中,這樣下次執行的時候直接使用緩存中的語句。html

這樣就能夠提升存儲過程的性能。sql

  1.  存儲過程Procedure是一組爲了完成特定功能的SQL語句集合,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名稱並給出參數來執行。
  2.  存儲過程當中能夠包含邏輯控制語句和數據操縱語句,它能夠接受參數、輸出參數、返回單個或多個結果集以及返回值。
  3.  因爲存儲過程在建立時即在數據庫服務器上進行了編譯並存儲在數據庫中,因此存儲過程運行要比單個的SQL語句塊要快。
  4.  同時因爲在調用時只需用提供存儲過程名和必要的參數信息,因此在必定程度上也能夠減小網絡流量、簡單網絡負擔。

 

 


 

存儲過程的優勢

一、存儲過程容許標準組件式編程

存儲過程建立後能夠在程序中被屢次調用執行,而沒必要從新編寫該存儲過程的SQL語句。數據庫

並且數據庫專業人員能夠隨時對存儲過程進行修改,但對應用程序源代碼卻毫無影響,從而極大的提升了程序的可移植性。編程

二、存儲過程可以實現較快的執行速度

若是某一操做包含大量的T-SQL語句代碼,分別被屢次執行,那麼存儲過程要比批處理的執行速度快得多。緩存

由於存儲過程是預編譯的,在首次運行一個存儲過程 時,查詢優化器對其進行分析、優化,並給出最終被存在系統表中的存儲計劃。安全

而批處理的T-SQL語句每次運行都須要預編譯和優化,因此速度就要慢一些。服務器

三、存儲過程減輕網絡流量

對於同一個針對數據庫對象的操做,若是這一操做所涉及到的T-SQL語句被組織成一存儲過程,微信

那麼當在客戶機上調用該存儲過程時,網絡中傳遞的只是該調用語句,不然將會是多條SQL語句。網絡

從而減輕了網絡流量,下降了網絡負載。微信公衆平臺

四、存儲過程可被做爲一種安全機制來充分利用

系統管理員能夠對執行的某一個存儲過程進行權限限制,從而可以實現對某些數據訪問的限制,避免非受權用戶對數據的訪問,保證數據的安全。

 

 


 存儲過程的缺點

一、運行速度

對於很簡單的sql,存儲過程運行速度沒有什麼優點。 

二、代碼可讀性差,不易於維護

存儲過程的開發調試要比通常程序困難(老版本DB2還只能用C寫存儲過程,更是一個災難)。

代碼可讀性差,不易於難維護。

三、可移植性差

因爲存儲過程將應用程序綁定到SQLServer,所以使用存儲過程封裝業務邏輯將限制應用程序的可移植性。

若是應用程序的可移植性在您的環境中很是重要,則將業務邏輯封裝在不特定於RDBMS的中間層中多是一個更佳的選擇。

 


存儲過程的基本語法

變量的聲明:
聲明變量時必須在變量前加@符號
declare @num int

變量的賦值:
變量賦值時變量前必須加set
set @num= 30

聲明多個變量:
declare @name varchar(10),@num int

if語句的使用:

declare @d int
set @d = 1
IF @d = 1
BEGIN
    PRINT '正確' 
END
ELSE BEGIN
PRINT '錯誤'
END

 

多條件選擇語句:

declare @today int
declare @week nvarchar(3)
set @today=3
set @week= case
     when @today=1 then '星期一'
     when @today=2 then '星期二'
     when @today=3 then '星期三'
     when @today=4 then '星期四'
     when @today=5 then '星期五'
     when @today=6 then '星期六'
     when @today=7 then '星期日'
     else '值錯誤'
end
print @week

 

循環語句:

DECLARE @i INT
SET @i = 1
WHILE @i<1000000 BEGIN
set @i=@i+1
END

 

定義遊標:

DECLARE @cur1 CURSOR FOR SELECT .........

OPEN @cur1
FETCH NEXT FROM @cur1 INTO 變量
WHILE(@@FETCH_STATUS=0)
BEGIN
處理.....
FETCH NEXT FROM @cur1 INTO 變量
END
CLOSE @cur1
DEALLOCATE @cur1

存儲過程的分類

一、系統存儲過程

系統存儲過程是系統建立的存儲過程,目的在於可以方便的從系統表中查詢信息或完成與更新數據庫表相關的管理任務或其餘的系統管理任務。

系統存儲過程主要存 儲在master數據庫中,以「sp」下劃線開頭的存儲過程。

儘管這些系統存儲過程在master數據庫中,但咱們在其餘數據庫仍是能夠調用系統存儲過 程。

有一些系統存儲過程會在建立新的數據庫的時候被自動建立在當前數據庫中。

1.一、系統存儲過程sql示例

--表重命名
exec sp_rename 'stu', 'stud';--列重命名
exec sp_rename 'stud.name', 'sName', 'column';
exec sp_help 'stud';
--重命名索引
exec sp_rename N'student.idx_cid', N'idx_cidd', N'index';
exec sp_help 'student';

--查詢全部存儲過程
select * from sys.objects where type = 'P';
select * from sys.objects where type_desc like '%pro%' and name like 'sp%';

二、自定義存儲過程

所謂自定義存儲過程,是指爲了完成某一段特定的功能需求,在用戶數據庫中利用t-sql自行編輯的語句集合,在用戶自定義的過程當中能夠有輸入參數,返回的輸出參數及返回至客戶端的信息與結果 。

若是在存儲過程名稱前加了「##」符號,表示建立的存儲過程是臨時的全局性的;

若是前面的爲「#」符號,表示所建立的存儲過程是臨時的局部的,該存儲過程只能在建立它的會話中使用。

以上兩種存儲過程建立後都存放在tempdb數據庫中。

用戶自定義存儲過程還能夠細分爲t-sql語言存儲過程和CLR存儲過程。CLR存儲過程是指利用.NET框架公共語言編輯的存儲過程,既能夠接受用戶提供的參數又能夠返回存儲過程的運行結果,一般用做某個類的公共靜態方法。

 2.一、建立不帶參數存儲過程

--建立一個返回結果集的存儲過程(proc或者procedure都可)
if (object_id('proc_get_student', 'P') is not null)--判斷存儲過程是否存在 另一種 if (exists (select * from sys.objects where name = 'proc_get_student'))//
drop proc proc_get_student --刪除存儲過程
go
create proc proc_get_student --建立存儲過程
as
select * from student; --結果集

--調用執行存儲過程,獲得返回集(exec或者execute都可)
exec proc_get_student;

2.二、修改存儲過程

--修改存儲過程
alter proc proc_get_student
as
select * from student;  --修改後的SQL語句

--調用執行存儲過程,獲得返回集(exec或者execute都可)
exec proc_get_student;

2.三、帶參數存儲過程

--建立一個返回結果集的存儲過程(proc或者procedure都可)
if (object_id('proc_find_stu', 'P') is not null)--判斷存儲過程是否存在
drop proc proc_find_stu
go
create proc proc_find_stu(@startId int, @endId int)--兩個參數
as
select * from student where id between @startId and @endId   --查詢語句
go

--調用執行存儲過程,2,4爲參數
exec proc_find_stu 2, 4;

2.四、帶通配符參數存儲過程

--建立一個返回結果集的存儲過程(proc或者procedure都可)
if (object_id('proc_findStudentByName', 'P') is not null)
drop proc proc_findStudentByName
go
create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%')
as
select * from student where name like @name and name like @nextName;
go

--調用執行存儲過程
exec proc_findStudentByName;
exec proc_findStudentByName '%o%', 't%';

2.五、帶輸出參數存儲過程

--建立一個返回結果集的存儲過程(proc或者procedure都可)
if (object_id('proc_getStudentRecord', 'P') is not null)
drop proc proc_getStudentRecord
go
create proc proc_getStudentRecord(
@id int, --默認輸入參數
@name varchar(20) out, --輸出參數
@age varchar(20) output--輸入輸出參數
)
as
select @name = name, @age = age from student where id = @id and sex = @age;
go

--調用執行存儲過程
declare @id int,
@name varchar(20),
@temp varchar(20);
set @id = 7;
set @temp = 1;
exec proc_getStudentRecord @id, @name out, @temp output;
select @name, @temp;
print @name '#' @temp;

三、擴展存儲過程

一般以「xp_」爲前綴標識,在sql server系統外經過執行動態連接庫,即DLL文件,來實現的功能,該存儲過程常用API接口進行編輯,能夠加載到sql server實例的地址空間裏試試運行。

在sql server常見的擴展存儲過程有:

  • xp_enumgroups 指定WINDOWS本地組列表在WINDOWS域中定義的全局組表
  • xp_findnextmsg 接受輸入的郵件ID號,返回輸出的郵件ID號
  • xp_grantlogin     給用戶分配對sql server2012系統的權限
  • xp_logevent    把用戶自定義消息輸入到sql server日誌文件或WINDOWS系統事件查看器中
  • xp_loginconfig 顯示sql server 2012實例運行時登錄的安全配置

 

好了,咱們就介紹到這裏吧,

拜拜,咱們下次見。

 

歡迎關注訂閱個人微信公衆平臺【熊澤有話說】,更多好玩易學知識等你來取
做者:熊澤-學習中的苦與樂
公衆號:熊澤有話說
出處: https://www.cnblogs.com/xiongze520/p/14595601.html
創做不易,任何人或團體、機構所有轉載或者部分轉載、摘錄,請在文章明顯位置註明做者和原文連接。  
相關文章
相關標籤/搜索