以前資料庫操作,我是很少用事務的,最近做一個項目,發現偶爾總是少一些資料沒有寫入到資料庫,也沒有報錯誤,看了半天,也不知道是什麼原因,後來
把一條insert語句分成兩條寫,就好了,資料就沒有丟失了,懷疑和寫入的欄位太大有關係。後來考慮還是不保險啊,就直接用事務了。
下面這個就是我寫的一個簡單的事務的例子。是單位就餐補助查詢用的,主要是根據就餐的記錄判斷餐別,對不同的人增加補助,就是一個運算而已,以前財
務用試算表也能做,看著試算表忙活半天,又心有不忍,做了個簡單的查詢,也講將就了。
CREATE PROCEDURE [dbo].[AddBZmoney] AS---確定就餐類型和補助金額
begin
begin
tran
insert into SumBZ(卡號,日期,餐別,就餐金額)--匯總每日就餐明細
SELECT Detail.卡號, Detail.就餐日期, dbo.GetBZType(Detail.就餐時間) AS 餐別,
--查詢就餐金額
SUM(Detail.消費金額) AS 消費金額
FROM Detail INNER JOIN
BZType ON dbo.GetBZType(Detail.就餐時間) = BZType.餐別
WHERE (Detail.狀態 =
0)
GROUP BY Detail.就餐日期, dbo.GetBZType(Detail.就餐時間), Detail.卡號
update Detail set 狀態=1 where 狀態=0--更新補助狀態
create table TempBZ--建立中間表,確定補助的金額
(
ID int,
BZmoney money
)
insert into TempBZ
SELECT SumBZ.ID,
CASE
WHEN SumBZ.就餐金額
>= BZType.補助標準 and People.加班補助=1 and SumBZ.餐別='晚餐'THEN
BZType.補助標準--晚餐有加班補助的,超過4元補4元
when SumBZ.就餐金額 >= BZType.補助標準 and
People.加班補助=0 and SumBZ.餐別='晚餐'then 0--晚餐無加班補助的,補0元
when SumBZ.就餐金額
>= BZType.補助標準 and SumBZ.餐別='午餐' then BZType.補助標準--午餐全部超過3元的,補3元
when
SumBZ.餐別='早餐' then BZType.補助標準--早餐不補
WHEN SumBZ.就餐金額 <
BZType.補助標準 THEN 0--未超過補助額度的不補
end
FROM SumBZ INNER JOIN
BZType ON SumBZ.餐別 = BZType.餐別 inner join People On People.卡號=SumBZ.卡號
declare @i int
set @i=(select min(ID) from TempBZ)
while
@i<=(select max(ID) from TempBZ)
begin
update SumBZ set
補助金額=(select BZmoney from TempBZ where ID=@i
)
where ID=@i
set @i=@i+1
end
drop
table TempBZ
if (@@error!=0)
begin
rollback tran
return(1)
end
commit
tran
end
GO