簡單來講,存儲過程就是一條或者多條sql語句的集合,可視爲批處理文件,可是其做用不只限於批處理。sql
1、存儲過程的概述數據庫
SQL Server中的存儲過程是使用T_SQL編寫的代碼段。它的目的在於可以方便的從系統表中查詢信息,或者完成與更新數據庫表相關的管理任務和其餘的系統管理任務.T_SQL語句是SQL Server數據庫與應用程序之間的編程接口。在不少狀況下,一些代碼會被開發者重複編寫屢次,若是每次都編寫相同功能的代碼,不但繁瑣,並且容易出錯,並且因爲SQL Server逐條的執行語句會下降系統的運行效率。編程
簡而言之,存儲過程就是SQL Server爲了實現特定任務,而將一些須要屢次調用的固定操做語句編寫成程序段,這些程序段存儲在服務器上,有數據庫服務器經過程序來調用。安全
存儲過程的優勢:服務器
存儲過程的缺點:網絡
說一下本身對存儲過程的理解:對於SQLServer中的存儲過程,和C#中的函數和類似,能夠理解爲一個函數,能夠給存儲過程攜帶參數,能夠有返回值,能夠帶有output參數,也可讓參數帶默認值。這樣子理解可讓本身快速理解存儲過程框架
2、存儲過程的分類ide
1.系統存儲過程模塊化
系統存儲過程是 SQL Server系統自身提供的存儲過程,能夠做爲命令執行各類操做。函數
系統存儲過程主要用來從系統表中獲取信息,使用系統存儲過程完成數據庫服務器的管理工做,爲系統管理員提供幫助,爲用戶查看數據庫對象提供方便,系統存儲過程位於數據庫服務器中,而且以sp_開頭,系統存儲過程定義在系統定義和用戶定義的數據庫中,在調用時沒必要在存儲過程前加數據庫限定名。例如:sp_rename系統存儲過程能夠修改當前數據庫中用戶建立對象的名稱,sp_helptext存儲過程能夠顯示規則,默認值或視圖的文本信息,SQL SERVER服務器中許多的管理工做都是經過執行系統存儲過程來完成的,許多系統信息也能夠經過執行系統存儲過程來得到。
系統存儲過程建立並存放在與系統數據庫master中,一些系統存儲過程只能由系統管理員使用,而有些系統存儲過程經過受權能夠被其它用戶所使用。
2.用戶存儲過程(自定義存儲過程)
自定義存儲過程即用戶使用T_SQL語句編寫的、爲了實現某一特定業務需求,在用戶數據庫中編寫的T_SQL語句集合,自定義存儲過程能夠接受輸入參數、向客戶端返回結果和信息,返回輸出參數等。建立自定義存儲過程時,存儲過程名前加上"##"表示建立了一個全局的臨時存儲過程;存儲過程前面加上"#"時,表示建立的局部臨時存儲過程。局部臨時存儲過程只能在建立它的回話中使用,會話結束時,將被刪除。這兩種存儲過程都存儲在tempdb數據庫中。
用戶定義的存儲過程分爲兩類:T_SQL 和CLR
T_SQL:存儲過程是值保存的T_SQL語句集合,能夠接受和返回用戶提供的參數,存儲過程也可能從數據庫向客戶端應用程序返回數據。
CLR存儲過程是指引用Microsoft.NET Framework公共語言的方法存儲過程,能夠接受和返回用戶提供的參數,它們在.NET Framework程序集是做爲類的公共靜態方法實現的。
3、存儲過程的建立
準備數據 以下:
use Test; --建立測試books表 create table Money ( id int identity(1,1) primary key, money int );
裏面插入若干條測試數據
1.建立一個無參存儲過程
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
修改存儲過程
alter procedure usp_getAllMoneyInfo as ********** go
2.建立一個帶參數的存儲過程 並執行
if exists(select * from sysobjects where name='usp_getMoneyInfo') drop proc usp_getMoneyInfo go --存儲過程至關於一個函數 能夠有參數,輸出參數 as後爲方法體 使用return進行返回-- create proc usp_getAllMoneyInfo --as前面爲定義參數 至關於函數中的參數, 不用進行聲明-- @id int as select * from Money where id=@id go exec usp_getMoneyInfo 2 --在調用後面添加參數--
3.建立一個帶output參數的存儲過程 並執行
if exists(select * from sysobjects where name='usp_getAllMoneyCount') drop proc usp_getAllMoneyInfo 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
4.建立一個帶有返回值的存儲過程 並執行
-帶有返回值的存儲過程-- --return只能返回整型的數據,若是須要返回其餘類型的數據,須要使用output輸出參數-- if exists(select * from sysobjects where name='usp_getCount') drop proc usp_getAllMoneyInfo 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 --獲取返回值的格式:在exec後面添加返回值變量=-- print @totalCount