程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL 存儲過程(3)

SQL 存儲過程(3)

編輯:關於SqlServer

批處理和錯誤

如:創建一個臨時表,把原表中需要的數據導入臨時表,將原表刪除再創建新表,把數據從臨時表導入新表,把臨時表刪除。
create table tmppart (partid int,make varchar(5))
go
inset into tmppart (partid,make)
select partid,make from part
go
drop table part
create table part(partid int,make varchar(5))
go
insert into part(partid,make)
select partid,make from tmppart
go
drop table tmppart
go
以上程序看上去完美,但實際上存在很大問題。比如第一個批處理出現語法錯誤,將不會創造臨時表,但是後面語句刪除原表仍然會執行,那

麼原表就消失了,數據也並沒有保存。

在批處理完成之前,產生的對象是不可訪問的。
如錯誤:
alter table part add cost money null
select partid,cost from part
go
更改為:
alter table part add cost money null
go
select partid,cost from part
go

 

顯示事務 將SQL語句分組到一個單一的事務中。分組語句中任意一個語句出現問題,所有更改都必須異常終止。
Begin Transaction  開始事務
Rollback Transaction  回滾事務
Commit Transaction  結束事務(將結果寫進數據庫)

例如:將租借計劃已經到期的資產項目的每月租借數目設置為0,同時將租借數目總計設置為0。
create procedure prclearleaseshedule
 @intleasescheduleid int
as

begin transaction
update inventory
set lease=0
where leasescheduleid=@leasescheduleid
if @@error<>0 goto problem
update leaseschedule
set periodictotalamount=0
where scheduleid=@intleasescheduleid
if @@error<>0 goto problem
commit transaction
return 0

problem:
print''unable to eliminate lease amounts from the datebase!''
rollback transaction
return 1

事務處理體系結構
事務日志在帶有.ldf的單獨文件中實現。存儲兩種類型的記錄:
·執行的邏輯操作:插入,刪除,啟動等(不包括查詢,因為查詢並不會修改內容)
·更改前後的數據映像(數據副本)

事務日志解決的問題為:
·客戶端應用程序在事務結束前丟失了連接,SQL將回滾更改,以保證一致性。
·如果機器掉電,當服務恢復時,SQL將恢復該數據庫,就好象沒發生過異常一樣,所有在問題發生之前沒完成的事務都將從數據庫中回滾。


嵌套事務  在嵌套事務中,除了外層的commit語句外,其他commit語句都不會保存對數據庫所做的更改。只有在提交最後一次事務之後,所有

對數據庫的更改才變成永久性的。在這之前,你可以回滾所有的更改。
begin transaction
...
    begin transaction
     ...
    commit transaction
...
commit transaction


保存點 只回滾部分事務的機制。
save transaction @chvinventoryid      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved