存儲過程(Stored Procedure)是在大型數據庫中,一組爲了完成特定功能的SQL 語句集,它存儲在數據庫中,一次編譯後永久有效,用戶經過指定存儲過程的名字並給出參數(若是該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象。在數據量特別龐大的狀況下利用存儲過程能達到倍速的效率提高------來源於百度百科sql
1系統存儲過程以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工做。數據庫
2本地存儲過程c#
用戶建立的存儲過程是由用戶建立並完成某一特定功能的存儲過程,事實上通常所說的存儲過程就是指本地存儲過程。後端
3臨時存儲過程安全
分爲兩種存儲過程:服務器
一是本地臨時存儲過程,以井字號(#)做爲其名稱的第一個字符,則該存儲過程將成爲一個存放在tempdb數據庫中的本地臨時存儲過程,且只有建立它的用戶才能執行它;網絡
二是全局臨時存儲過程,以兩個井字號(##)號開始,則該存儲過程將成爲一個存儲在tempdb數據庫中的全局臨時存儲過程,全局臨時存儲過程一旦建立,之後鏈接到服務器的任意用戶均可以執行它,並且不須要特定的權限。數據結構
4遠程存儲過程框架
在SQL Server2005中,遠程存儲過程(Remote Stored Procedures)是位於遠程服務器上的存儲過程,一般可使用分佈式查詢和EXECUTE命令執行一個遠程存儲過程。分佈式
5擴展存儲過程
擴展存儲過程(Extended Stored Procedures)是用戶可使用外部程序語言編寫的存儲過程,並且擴展存儲過程的名稱一般以xp_開頭。
------來源於百度百科
①重複使用。存儲過程能夠重複使用,從而能夠減小數據庫開發人員的工做量。②減小網絡流量。存儲過程位於服務器上,調用的時候只須要傳遞存儲過程的名稱以及參數就能夠了,所以下降了網絡傳輸的數據量。
③安全性。參數化的存儲過程能夠防止SQL注入式攻擊,並且能夠將Grant、Deny以及Revoke權限應用於存儲過程。
簡單講:
1.存儲過程只在創造時進行編譯,之後每次執行存儲過程都不需再從新編譯,而通常SQL語句每執行一次就編譯一次,因此使用存儲過程可提升數據庫執行速度。
2.當對數據庫進行復雜操做時(如對多個表進行Update,Insert,Query,Delete時),可將此複雜操做用存儲過程封裝起來與數據庫提供的事務處理結合一塊兒使用。
3.存儲過程能夠重複使用,可減小數據庫開發人員的工做量
4.安全性高,可設定只有某些用戶才具備對指定存儲過程的使用權
有一點須要注意的是,一些網上盛傳的所謂的存儲過程要比sql語句執行更快的說法,其實是個誤解,並無根據,包括微軟內部的人也不承認這一點,因此不能做爲正式的優勢,但願你們可以認識到這一點。
1:調試麻煩。2:數據庫移植不方便,存儲過程依賴與數據庫管理系統, SQL Server 存儲過程當中封裝的操做代碼不能直接移植到其餘的數據庫管理系統中。
3:從新編譯問題,由於後端代碼是運行前編譯的,若是帶有引用關係的對象發生改變時,受影響的存儲過程、包將須要從新編譯(不過也能夠設置成運行時刻自動編譯)。
4: 若是在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨着用戶需求的增長會致使數據結構的變化,接着就是系統的相關問題了,最後若是用戶想維護該系統能夠說是很難很難、並且代價是空前的,維護起來更麻煩。
5:不支持面向對象的設計,沒法採用面向對象的方式將邏輯業務進行封裝,甚至造成通用的可支持服務的業務邏輯框架。
use Test;
--建立測試books表
create table Money (
id int identity(1,1) primary key,
money int
);
--建立一個無參存儲過程
if exists(select * from sysobjects where name='usp_getAllMoneyInfo')
drop proc usp_getAllMoneyInfo
go
--存儲過程至關於一個函數 能夠有參數,輸出參數 as後爲方法體 使用return進行返回--
create proc usp_getAllMoneyInfo
--as前面爲定義參數 至關於函數中的參數, 不用進行聲明--
as
select * from Money
go
--執行存儲過程
exec usp_getAllMoneyInfo;
--刪除存儲過程
drop proc usp_getAllMoneyInfo;
go
alter proc usp_getAllMoneyInfo
as
select Money.money from Money
go
if exists(select * from sysobjects where name='usp_getMoneyInfo')
drop proc usp_getMoneyInfo
go
--建立一個帶參數的存儲過程 並執行
create proc usp_getMoneyInfo
--as前面爲定義參數 至關於函數中的參數 不用進行聲明
@id int
as
select * from Money where id=@id
go
exec usp_getMoneyInfo 2 --在調用後面添加參數
go
--建立一個帶output參數的存儲過程 並執行
if exists(select * from sysobjects where name='usp_getAllMoneyCount')
drop proc usp_getAllMoneyCount
go
create proc usp_getAllMoneyCount
@count int output --外部參數在後面加output相似於c#的out
as
set @count = (select count(*) from Money)
go
declare @cnt int;
exec usp_getAllMoneyCount @count=@cnt output --在調用的時候 要加output的關鍵字
print @cnt
--建立一個帶有返回值的存儲過程 並執行
--帶有返回值的存儲過程--
--return只能返回整型的數據,若是須要返回其餘類型的數據,須要使用output輸出參數--
if exists(select * from sysobjects where name='usp_getCount')
drop proc usp_getCount
go
create proc usp_getCount
as
declare @count int
set @count = (select count(*) from Money)
return @count
go
declare @totalCount int
exec @totalCount = usp_getCount
print @totalCount
文章持續更新,若是喜歡,請拿起大家可愛的小手,給我點個贊吧!點贊是一種積極的生活態度,贊一個吧!