建庫建表建約束
插入數據
--建庫建表建約束和插入測試數據
use bankDB go
--1.完成存款,取款業務
--存款
create proc usp_takeMoney @takeType nvarchar(2),@Money money,@cardID char(19),@pass char(6)=null,@remark text =null as print '交易正在進行,請稍后......' if((select COUNT(1) from cardInfo where cardID=@cardID)=0) begin raiserror('卡號不存在!',16,1) end else --開始事務處理 begin --存款 if(@takeType='存入') begin declare @errorSum int set @errorSum=0 begin tran insert into tradeInfo values(GETDATE(),'存入',@cardID,@Money,@remark) set @errorSum+=@@ERROR update cardInfo set balance+=@Money where cardID=@cardID set @errorSum+=@@ERROR if(@errorSum<>0) begin rollback tran raiserror('交易失敗,未知錯誤!',16,1) end else begin commit tran print '交易成功!交易金額:'+convert(nvarchar,@Money) end end --取款 else begin if(@pass=(select pass from cardInfo where cardID=@cardID)) begin if((select balance from cardInfo where cardID=@cardID)>@Money) begin declare @errorSum2 int set @errorSum2=0 begin tran insert into tradeInfo values(GETDATE(),'支取',@cardID,@Money,@remark) set @errorSum2+=@@ERROR update cardInfo set balance-=@Money where cardID=@cardID set @errorSum2+=@@ERROR if(@errorSum2<>0) begin rollback tran raiserror('交易失敗!未知錯誤!',16,1) end else begin commit tran print '交易成功!交易金額:'+convert(nvarchar,@Money) end end else begin raiserror('交易失敗!余額不足!',16,1) end end else begin raiserror('密碼不正確!請檢查重輸',16,1) end end end go
--檢查調用存儲過程
exec usp_takeMoney '取出',600,'1010 3576 1234 5678',888888 exec usp_takeMoney '存入',500,'1010 3576 1234 5678',default,'定期存入' go
--****************************************************************************************************************************************************
--2.產生隨機卡號
create proc usp_randCardID @randCardID char(19) output as declare @r numeric(15,8),@tempR varchar(10) select @r=rand(datepart(mm,getdate())*100000+datepart(ss,getdate())*1000+datepart(ms,getdate())) set @tempR=convert(char(10),@r) set @randCardID='1010 3576 '+SUBSTRING(@tempR,3,4)+' '+SUBSTRING(@tempR,7,4) go
-調用隨機卡號存儲過程
declare @A varchar(19) exec usp_randCardID @A output print @A go
--****************************************************************************************************************************************************
--3.完成開戶業務
create proc usp_openAccount @name char(8),@identityID char(18),@telPhone char(20),@Money money,@savingName varchar(20),@address varchar(50)=null as --判定是否存在輸入的存款類型 declare @savingID int,@cardID char(19),@openDate datetime,@openMoney money if exists(select COUNT(1) from Deposit where savingName=@savingName) begin --將存款類型標號賦值給變量 select @savingID=(select savingID from Deposit where savingName=@savingName) --調用隨機卡號存儲過程,獲取隨機卡號 exec usp_randCardID @cardID output declare @errorSum int,@identity int set @errorSum=0 --啟動事務 begin tran --向客戶表添加數據 insert into userInfo values(@name,@identityID,@telPhone,@address) set @identity=@@IDENTITY set @errorSum+=@@ERROR --並獲取當前日期,傳出開戶金額參數 set @openDate=GETDATE() set @openMoney=@Money --向銀行卡信息表添加數據 insert into cardInfo values(@cardID,'RMB',@savingID,@openDate,@openMoney,@Money,'123456',0,@identity) set @errorSum+=@@ERROR if(@errorSum<>0) begin rollback tran raiserror('添加客戶失敗!未知錯誤!',16,1) end else begin commit tran print '尊敬的客戶,開戶成功!系統為您產生的隨機卡號為:'+@cardID+'卡戶日期:'+convert(varchar,@openDate)+'開戶金額:'+convert(nvarchar,@openMoney) end end else begin raiserror('存款類型不存在!',16,1) end go
--調用存儲過程
exec usp_openAccount '王老五','334456889012678','2222-63598978',1000,'活期','河南新鄉' exec usp_openAccount '趙小二','213445678912342222','0760-44446666',1,'定期一年' go
--****************************************************************************************************************************************************
--4.分頁顯示查詢交易數據
create proc usp_pagingDisplay @page int,@count int as select tradeDate, tradeType, cardID, tradeMoney, remark from ( select *,ROW_NUMBER() over(order by tradeDate) as myid from tradeInfo )as new where myid between (@page-1)*@count+1 and @page*@count go
--調用存儲過程
exec usp_pagingDisplay 4,2 go
--****************************************************************************************************************************************************
--5.打印客戶對賬單
create proc usp_CheckSheet @cardID char(19),@beginTime datetime=null,@endTime datetime=null as declare @minDate datetime,@maxDate datetime select @minDate=MIN(tradedate) from tradeInfo where cardID=@cardID select @maxDate=MAX(tradedate) from tradeInfo where cardID=@cardID select * from tradeInfo where cardID=@cardID and tradeDate between( case when @beginTime IS NULL then @minDate when @beginTime is not null then @beginTime end )and( case when @endTime IS NULL then @maxDate when @endTime is not null then @endTime end ) go
--調用存儲過程
exec usp_CheckSheet '1010 3576 1234 5678','2016-08-14 09:59:31.793','2016-08-16 10:00:13.913' go
--****************************************************************************************************************************************************
--6.統計未發生交易的賬戶
create proc usp_getWithoutTrade @beginTime datetime =null,@endTime datetime=null as --指定時間沒發生交易的客戶記錄 select * from userInfo where customerID in ( select customerID from cardInfo where cardID not in( select cardID from tradeInfo where tradeDate between( case when @beginTime IS NULL then convert(datetime,datename(yy,getdate())+'.'+datename(mm,getdate())+'.'+'01') when @beginTime is not null then @beginTime end )and( case when @endTime IS NULL then GETDATE() when @endTime is not null then @endTime end ) ) ) declare @peopNum int ,@moneySum money select @peopNum=COUNT(1) from userInfo where customerID in ( select customerID from cardInfo where cardID not in( select cardID from tradeInfo where tradeDate between( case when @beginTime IS NULL then convert(datetime,datename(yy,getdate())+'.'+datename(mm,getdate())+'.'+'01') when @beginTime is not null then @beginTime end )and( case when @endTime IS NULL then GETDATE() when @endTime is not null then @endTime end ) ) ) select @moneySum=SUM(balance) from cardInfo where cardID not in( select cardID from tradeInfo where tradeDate between( case when @beginTime IS NULL then convert(datetime,datename(yy,getdate())+'.'+datename(mm,getdate())+'.'+'01') when @beginTime is not null then @beginTime end )and( case when @endTime IS NULL then GETDATE() when @endTime is not null then @endTime end ) ) print '統計未發生交易的客戶' print '--------------------------------------------' print '客戶人數:'+convert(char,@peopNum)+' 客戶總余額:'+convert(varchar,@moneySum) go
--調用存儲記錄
exec usp_getWithoutTrade '2016-08-16 09:58:36.720','2016-08-16 09:59:40.940' go
--****************************************************************************************************************************************************
--統計銀行卡交易量和交易額
create proc usp_getTradeInfo @address nvarchar(50),@beginTime datetime=null,@endTime datetime=null as declare @insertCount int,@insertSum money,@outCount int,@outSum money --存入客戶人數 select @insertCount=COUNT(1) from tradeInfo where tradeType='存入' and cardID in( select cardID from cardInfo where customerID in( select customerID from userInfo where address like '%'+@address+'%' ) )and tradeDate between( case when @beginTime IS NULL then convert(datetime,datename(yy,getdate())+'.'+'01'+'.'+'01') when @beginTime is not null then @beginTime end )and( case when @endTime IS NULL then GETDATE() when @endTime is not null then @endTime end ) --存入金額總量 select @insertSum=SUM(tradeMoney) from tradeInfo where tradeType='存入' and cardID in( select cardID from cardInfo where customerID in( select customerID from userInfo where address like '%'+@address+'%' ) )and tradeDate between( case when @beginTime IS NULL then convert(datetime,datename(yy,getdate())+'.'+'01'+'.'+'01') when @beginTime is not null then @beginTime end )and( case when @endTime IS NULL then GETDATE() when @endTime is not null then @endTime end ) --存入客戶人數 select @outCount=count(1) from tradeInfo where tradeType='支取' and cardID in( select cardID from cardInfo where customerID in( select customerID from userInfo where address like '%'+@address+'%' ) )and tradeDate between( case when @beginTime IS NULL then convert(datetime,datename(yy,getdate())+'.'+'01'+'.'+'01') when @beginTime is not null then @beginTime end )and( case when @endTime IS NULL then GETDATE() when @endTime is not null then @endTime end ) --存入金額總量 select @outSum=SUM(tradeMoney) from tradeInfo where tradeType='支取' and cardID in( select cardID from cardInfo where customerID in( select customerID from userInfo where address like '%'+@address+'%' ) )and tradeDate between( case when @beginTime IS NULL then convert(datetime,datename(yy,getdate())+'.'+'01'+'.'+'01') when @beginTime is not null then @beginTime end )and( case when @endTime IS NULL then GETDATE() when @endTime is not null then @endTime end ) print '存入筆數:'+convert(varchar,@insertCount)+' '+'存入金額:'+convert(varchar,@insertSum) print '支取筆數:'+convert(varchar,@outCount)+' '+'支取金額:'+convert(varchar,@outSum) go
--調用存儲過程
exec usp_getTradeInfo '北京' go
--****************************************************************************************************************************************************
--利用事務實現較復雜的數據更新
create proc usp_tradefer @outCardID char(19),@pass char(6),@insertCardId char(19),@tradeMoney money,@remark text=null as if(@pass<>(select pass from cardInfo where cardID=@outCardID)) begin raiserror('密碼錯誤!',16,1) return end print '開始轉賬,請稍候......' print '交易正在進行,請稍候......' declare @errorSum int,@dateTime datetime set @errorSum=0 set @dateTime=GETDATE() begin tran update cardInfo set balance-=@tradeMoney where cardID=@outCardID set @errorSum+=@@ERROR insert into tradeInfo values (@dateTime,'支取',@outCardID,@tradeMoney,@remark) set @errorSum+=@@ERROR update cardInfo set balance+=@tradeMoney where cardID=@insertCardId set @errorSum+=@@ERROR insert into tradeInfo values (@dateTime,'存入',@insertCardId,@tradeMoney,@remark) set @errorSum+=@@ERROR if(@errorSum<>0) begin rollback tran raiserror('轉賬失敗!未知錯誤',16,1) end else begin commit tran declare @balance money select @balance=balance from cardInfo where cardId=@outCardId print '交易成功!交易金額:'+convert(varchar,@tradeMoney) print '轉出卡號:'+@outCardId+' '+'余額:'+convert(varchar,@balance) print '轉入卡號:'+@insertCardId select * from tradeInfo where cardID=@outCardID and tradeDate=@dateTime select * from tradeInfo where cardID=@insertCardId and tradeDate=@dateTime end
--調用存儲方法
exec usp_tradefer '1010 3576 1212 1004','888888','1010 3576 1212 1130',500 select * from cardInfo
