存儲過程(StoredProcedure)是一種數據庫對象。
存儲過程是一組為了完成特定功能的SQL語句集,經編譯後存儲在數據庫中。使用存儲過程的好處
省掉了SQL語句在SqlServer中的編譯過程,提高程序運行效率
應用程序中不用編寫很長的SQL語句,提高代碼可讀性
數據庫的操作方法和應用程序的設計方法有效隔離,有利安全
存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。存儲過程存儲在數據庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變量、有條件執行以及其它強大的編程功能。存儲過程可以使得對數據庫的管理、以及顯示關於數據庫及其用戶信息的工作容易得多。存儲過程可包含程序流、邏輯以及對數據庫的查詢。它們可以接受參數、輸出參數、返回單個或多個結果集以及返回值。 可以出於任何使用 SQL 語句的目的來使用存儲過程,它具有以下優點: 可以在單個存儲過程中執行一系列 SQL 語句。可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。存儲過程在創建時即在服務器上進行編譯,所以執行起來比單個 SQL 語句快。你可以在SQL的聯機叢書裡面找到相關的解釋,以及語法運用
在最新的SQL2005中的存儲過程(Procedure)類似於Java語言中的方法,它是SQL語句和控制流語句的預編譯集合。存儲過程在數據庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變量,邏輯控制語句以及其他強大的編程功能。
存儲過程可包含邏輯控制語句和數據操作語句,它可以接收參數,輸出參數,返回單個或多個結果集以及返回值。
存儲過程就相當於編程語言中的函數或方法,根據用戶給定的參數執行一段代碼
例:你給我20分,我從鍵盤輸入文字,回答問題,並提交答案.我所做的就是一個存儲過程,你給的20分是參數,你給的分多,我就回答的詳細
事務是一種機制,確保一組數據庫命令,要麼全都執行,要麼都不執行
例:你到銀行轉帳1000元到我的賬戶裡,當錢剛從你的賬戶裡取出來(還沒來的及轉入我的賬戶),突然斷電了,這時你的賬戶就莫名其妙的損失了1000元,事務就是為了避免這種情況,只有當你的賬戶減少1000,並且我的賬戶存入1000之後,這個轉帳才算成功,所以就要將"存款"和"取款"寫到一個事務中去
簡單的小例子CREATE PROCEDURE testPro
AS
/**//* 事務開始 */
BEGIN TRANSACTION tran_test /**//* 保存事務 */
SAVE TRANSACTION tran_test /**//*數據操作 */
INSERT [table1] ( [content] ) VALUES ( '43332' ) /**//*提交事務 */
COMMIT TRANSACTION tran_test /**//*判斷是否有錯誤 */
IF ( @@ERROR <> 0 )
BEGIN
/**//*自定義錯誤輸出
RAISERROR( 'Insert data error!',16,1 )
/**//* 事務回滾 */
ROLLBACK TRANSACTION tran_test
END /**//* 判斷事務數是否大於0 */
IF ( @@TRANCOUNT > 0 )
BEGIN
/**//* 事務回滾 */
ROLLBACK TRANSACTION tran_test
END
GO
create proc proc_takeMoney
@cardID1 varchar(20), --匯款賬號
@pwd int , --匯款密碼
@takeMoney money, --匯款金額
@cardID2 varchar(20) --存款賬號
as
set nocount on
declare @err int
set @err = 0
if exists(select 1 from cardInfo where cardID = @cardID1 and pass = @pwd)
begin
begin tran --事物開始
update cardInfo set balance = balance + @takeMoney where cardID = @cardID2 --接受款帳戶加上@takeMoney
set @err = @err + @@error
update cardInfo set balance = balance - @takeMoney where cardID = @cardID1 --匯款帳戶減去@takeMoney
set @err = @err + @@error insert into transInfo(transDate,cardId,transType,transMoney) values(default,@cardID1,'支取',@takeMoney)
set @err = @err + @@error
insert into transInfo(transDate,cardId,transType,transMoney) values(default,@cardID2,'存入',@takeMoney)
set @err = @err + @@error select top 2 * from transInfo order by transDate desc
if(@err<>0)
begin
rollback tran --錯誤回滾事物
end
else
begin
commit tran --無錯誤提交事物
end
end --if結束
else
begin
print '密碼錯誤'
end /*--調用存儲過程--*/
declare @cardID1 varchar(20),@cardID2 varchar(20),@pwd int ,@takeMoney money
set @cardID1 ='1010 3576 1234 5678' --張三卡號
set @pwd = 888888 --張三密碼
set @cardID2 ='1010 3576 1212 1134' --李四卡號
set @takeMoney =20 --匯款金額 exec proc_takeMoney @cardID1 ,@pwd,@takeMoney,@cardID2