实用的银行转账存储过程和流水号生成存储过程

时间:2022-11-04 21:39:44

银行转账存储过程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
USE [BankInfor]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Transfer](@inAccount int,@outAccount int,@amount float)
as declare
  @totalDeposit float;
  begin
  select @totalDeposit=total from Account where AccountNum=@outAccount;
  if @totalDeposit is null
  begin
  rollback;
  print'转出账户不存在或账户中没有存款'
  return;
  end
  if @totalDeposit<@amount
  begin
  rollback;
  print'余额不足,不能操作'
  return;
  end
  update Account set total=total-@amount where AccountNum=@outAccount;
  update Account set total=total+@amount where AccountNum=@inAccount;
  print'转账成功!'
  commit;
  end;

流水号生成存储过程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
if exists(select 1 from sysobjects where id=OBJECT_ID('GetSerialNo') and xtype='p')
drop proc GetSerialNo
go
Create procedure [dbo].[GetSerialNo] 
  @sCode varchar(50) 
as
begin
 Declare @sValue varchar(16),@dToday  datetime,@sQZ varchar(50) --这个代表前缀
  Begin Tran  
  Begin Try 
   -- 锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了
  --在同一个事物中,执行了update语句之后就会启动锁
  Update SerialNo set sValue=sValue where sCode=@sCode 
  Select @sValue = sValue From SerialNo where sCode=@sCode 
  Select @sQZ = sQZ From SerialNo where sCode=@sCode 
   -- 因子表中没有记录,插入初始值 
   If @sValue is null
   Begin
    Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + '000001'
    Update SerialNo set sValue=@sValue where sCode=@sCode 
   end else
   Begin        --因子表中没有记录 
    Select @dToday = substring(@sValue,1,6) 
    --如果日期相等,则加1 
    If @dToday = convert(varchar(6), getdate(), 12) 
     Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1)) 
    else       --如果日期不相等,则先赋值日期,流水号从1开始 
     Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +'000001'
   Update SerialNo set sValue =@sValue where sCode=@sCode 
   End
  Select result = @sQZ+@sValue  
   Commit Tran 
  End Try 
  Begin Catch 
   Rollback Tran 
   Select result = 'Error'
  End Catch 
end
select*from SerialNo
select convert(varchar(6), getdate(), 12)+'000001'