示例2 案例

USE BankDB
GO

--用例4:常规业务处理-----------------------------------------------------------------------------------------------------------

--统计银行资金流通余额和盈利结算---------------------------------
--资金流通率余额=总存入金额-总支取金额  假定 存款利率为千分之三,贷款利率为千分之八  盈利结算=总支取金额x0.008-总存入金额x0.003

DECLARE @inMoney decimal(10,2)
DECLARE @outMoney decimal(10,2)
SELECT @inMoney = SUM(TradeMoney) FROM TradeInfo WHERE TradeType = '存入'
SELECT @outMoney = SUM(TradeMoney) FROM TradeInfo WHERE TradeType = '支取'

PRINT '银行流通余额总计为:'+CONVERT(varchar(20),@inMoney-@outMoney)
PRINT '盈利结算为:'+CONVERT(varchar(20),@inMoney*0.008-@outMoney*0.003)
GO
--查询本周开户信息---------------------------------------------
SELECT CardNo AS 卡号,UserName AS 姓名,MoneyType AS 货币, DepositName AS 存款类型,
      AccountDate AS 开户日期,AccountMoney AS 开户金额,SaveMoney AS 存款余额,
      AccountState AS 账户状态
FROM CardInfo
   INNER JOIN Deposit ON CardInfo.DepositId = Deposit.DepositId
WHERE  DATEPART(yy,GETDATE())+DATEPART(wk,GETDATE()) = DATEPART(yy,AccountDate)+DATEPART(wk,AccountDate)
--DATEDIFF(dd,7,'2009-01-01') <= AccountDate AND  AccountDate<='2009-12-30'
--DATEDIFF(dd,7,GETDATE()) <= AccountDate AND  AccountDate<=GETDATE()
GO
--查询本月交易金额最高的卡号---------------------------------------------

SELECT CardNo,TradeMoney FROM TradeInfo WHERE TradeMoney = 
         (SELECT MAX(TradeMoney) FROM TradeInfo 
         WHERE DATEPART(yy,GETDATE())+DATEPART(wk,GETDATE()) = DATEPART(yy,TradeDate)+DATEPART(wk,TradeDate))
GO

--查询挂失客户------------------------------------------------------------

SELECT UserName AS 客户姓名, Telephone AS 联系电话
FROM CardInfo
WHERE  AccountState = '已挂失'
GO

--催款提醒业务------------------------------------------------------------

SELECT UserName AS 客户姓名, Telephone AS 联系电话,SaveMoney AS 存款余额
FROM CardInfo
WHERE  SaveMoney <= 200
GO

--用例5:创建、使用视图-----------------------------------------------------------------------------------------------------------

--输出银行客户记录vw_userInfo-----------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'vw_userInfo' )
   DROP VIEW vw_userInfo
GO
CREATE VIEW vw_userInfo
AS
   SELECT [UserName] AS 姓名,[IdentityCard] AS 身份证号, [Telephone] AS 电话号码,[Address] AS 居住地址
   FROM [UserInfo]
GO

SELECT * FROM vw_userInfo

--输出银行卡记录vw_cardInfo----------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'vw_cardInfo' )
   DROP VIEW vw_cardInfo
GO
CREATE VIEW vw_cardInfo
AS
   SELECT CardNo AS 卡号,UserName AS 客户,MoneyType AS 货币, DepositName AS 存款类型,
         AccountDate AS 开户日期,SaveMoney AS 余额,[PassWord] AS 密码,
         AccountState AS 账户状态
   FROM CardInfo
      INNER JOIN Deposit ON CardInfo.DepositId = Deposit.DepositId
GO
SELECT * FROM vw_cardInfo

--输出银行卡交易记录vw_tradeInfo-----------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'vw_tradeInfo' )
   DROP VIEW vw_tradeInfo
GO
CREATE VIEW vw_tradeInfo
AS
   SELECT TradeDate AS 交易日期,TradeType AS 交易类型,CardNo AS 卡号,TradeMoney AS 交易金额, Remark AS 备注
   FROM TradeInfo
GO
SELECT * FROM vw_tradeInfo


--用例6:使用存储过程-----------------------------------------------------------------------------------------------------------

--实现存取款业务--------------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_takeMoney' )
   DROP PROCEDURE usp_takeMoney
GO
CREATE PROCEDURE usp_takeMoney
   @cardNo nvarchar(20),
   @inMoney decimal(10,2),
   @password nvarchar(20) =NULL   --NULL就是存款 非NULL就是取款
AS
   DECLARE @n int
   SET @n = 0
   DECLARE @spare decimal(10,2)
   SELECT @spare=SaveMoney FROM CardInfo WHERE CardNo = @cardNo
   DECLARE @pswd nvarchar(20)
   SELECT @pswd = PassWord  FROM CardInfo WHERE CardNo = @cardNo
   IF(@password IS NOT NULL)
      BEGIN
         IF(@pswd <> @password)
            BEGIN                 
               RAISERROR('密码不符合',16,1)
               RETURN
            END
         IF(@inMoney > @spare-1)
            BEGIN
               RAISERROR('交易失败,余额不足',16,1)
               PRINT '卡号'+CAST(@cardNo AS nvarchar(20))+'余额'+CAST(@spare AS nvarchar(20))
               RETURN
            END
      END
   DECLARE @tempMoney decimal(10,2)
   BEGIN TRANSACTION
   PRINT '交易正进行,请稍后...'
   IF(@password IS NULL)--NULL存款
      BEGIN
         SET @tempMoney = @inMoney + @spare

         INSERT INTO TradeInfo(CardNo,TradeDate,TradeType,TradeMoney,SpareMoney)
            VALUES(@cardNo,DEFAULT,'存入',@inMoney,@tempMoney)
         SET @n = @n+@@ERROR
         UPDATE CardInfo SET SaveMoney = @tempMoney WHERE CardNo = @cardNo
         SET @n = @n+@@ERROR
      END
   ELSE --非NULL取款    
      BEGIN
         SET @tempMoney = @spare - @inMoney

         INSERT INTO TradeInfo(CardNo,TradeDate,TradeType,TradeMoney,SpareMoney)
            VALUES(@cardNo,DEFAULT,'支取',@inMoney,@tempMoney)
         SET @n = @n+@@ERROR
         UPDATE CardInfo SET SaveMoney = @tempMoney WHERE CardNo = @cardNo
         SET @n = @n+@@ERROR
      END
   IF (@n = 0)
      BEGIN
         PRINT '交易成功!交易金额:' + CAST(@inMoney AS nvarchar(20))
         PRINT '卡号'+CAST(@cardNo AS nvarchar(20))+'余额'+CAST(@tempMoney AS nvarchar(20))
         COMMIT TRANSACTION
      END
   ELSE
      BEGIN
         PRINT '交易失败'
         PRINT '卡号'+CAST(@cardNo AS nvarchar(20))+'余额'+CAST(@tempMoney AS nvarchar(20))
         ROLLBACK TRANSACTION
      END
GO

EXEC usp_takeMoney '1010357612121130',1000,'888888'


--产生随机卡号------------------------------------------------

IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_randCardID' )
   DROP PROCEDURE usp_randCardID
GO
CREATE PROCEDURE usp_randCardID
   @randNo nvarchar(20) OUTPUT
AS
   DECLARE @r decimal(15,8)
   DECLARE @right nvarchar(10)
   SELECT @r = RAND(DATEPART(mm,GETDATE())*100000+DATEPART(ss,GETDATE())*1000+DATEPART(ms,GETDATE()))
   SET @right = RIGHT(@r,8)
   SET @randNo = '10103576'+@right
GO

DECLARE @myCardNo nvarchar(20)
EXEC usp_randCardID @myCardNo OUTPUT
PRINT @myCardNo

--完成开户业务------------------------------------------------

IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_openAccount' )
   DROP PROCEDURE usp_openAccount
GO
CREATE PROCEDURE usp_openAccount
   @identityCard nvarchar(30),
   @userName nvarchar(30),
   @phone nvarchar(30),
   @address nvarchar(50),
   @accountStartMoney decimal(10,2),
   @depositName nvarchar(20)
AS
   DECLARE @depositId int
   SELECT @depositId = DepositId FROM Deposit WHERE DepositName=@depositName
   DECLARE @newCardNo nvarchar(20)
   EXEC usp_randCardID @newCardNo OUTPUT

   BEGIN TRANSACTION
   DECLARE @n int
   SET @n = 0
   --如果开户用户已存在 直接插入CardInfo表  否则先将信息插入到UserInfo表
   IF EXISTS(SELECT * FROM UserInfo WHERE IdentityCard=@identityCard)
      BEGIN
         INSERT INTO CardInfo(CardNo,UserName,IdentityCard,Telephone,[Address],DepositId,AccountMoney,SaveMoney)
            VALUES(@newCardNo,@userName,@identityCard,@phone,@address,@depositId,@accountStartMoney,@accountStartMoney)
         SET @n = @n + @@ERROR
      END
   ELSE
      BEGIN
         INSERT INTO UserInfo(IdentityCard,UserName,Telephone,[Address])
            VALUES(@identityCard,@userName,@phone,@address)
         SET @n = @n + @@ERROR
         INSERT INTO CardInfo(CardNo,UserName,IdentityCard,Telephone,[Address],DepositId,AccountMoney,SaveMoney)
            VALUES(@newCardNo,@userName,@identityCard,@phone,@address,@depositId,@accountStartMoney,@accountStartMoney)
         SET @n = @n + @@ERROR
      END

   IF (@n = 0)
      BEGIN
         PRINT '开户成功:'+@newCardNo
         PRINT '开户日期:'+CONVERT(varchar(30),GETDATE(),102)+'  开户金额:'+CONVERT(varchar(30),@accountStartMoney)
         COMMIT TRANSACTION
      END
   ELSE
      BEGIN
         PRINT '开户失败'
         ROLLBACK TRANSACTION
      END
GO
EXEC usp_openAccount '567891321242345799','zz','0752-43345223','asdasd',1,'活期'


--分页显示查询交易数据---------------------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_pagingDisplay' )
   DROP PROCEDURE usp_pagingDisplay
GO
CREATE PROCEDURE usp_pagingDisplay
   @page int =1,     --指定的第几页
   @eachPage int =2   --每页多少条
AS
   SELECT TOP (@eachPage) TradeDate AS 交易日期,TradeType AS 交易类型,CardNo AS 卡号,TradeMoney AS 交易金额 
   FROM TradeInfo
   WHERE TradeId NOT IN 
   (
      SELECT TOP ((@page-1)*@eachPage) TradeId FROM TradeInfo ORDER BY TradeId ASC
   )
   ORDER BY TradeId ASC
GO
EXEC usp_pagingDisplay 1,4


--打印客户对账单------------------------------------------------------
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_CheckSheet' )
   DROP PROCEDURE usp_CheckSheet
GO
CREATE PROCEDURE usp_CheckSheet
   @cardNo nvarchar(20),
   @searchStartDate datetime =NULL,
   @searchEndDate datetime =NULL
AS
   DECLARE @name nvarchar(20)
   SELECT @name = UserName FROM CardInfo WHERE CardNo=@cardNo
   DECLARE @depositName nvarchar(20)
   SELECT @depositName = DepositName FROM Deposit WHERE DepositId = 
            (SELECT DepositId FROM CardInfo WHERE CardNo = @cardNo)
   DECLARE @date datetime
   SELECT @date = AccountDate FROM CardInfo WHERE CardNo = @cardNo
   PRINT '卡号:'+@cardNo
   PRINT '姓名:'+@name
   PRINT '货币:RMB'
   PRINT '储存类型:'+@depositName
   PRINT '开户日期:'+CONVERT(varchar(20),@date,102)
   IF(@searchStartDate IS NULL OR @searchEndDate IS NULL)
      BEGIN
         SELECT TradeDate AS 交易日期,TradeType AS 类型,
               TradeMoney AS 交易金额,Remark AS 备注
         FROM TradeInfo WHERE CardNo=@cardNo
      END
   ELSE
      BEGIN
         SELECT TradeDate AS 交易日期,TradeType AS 类型,
               TradeMoney AS 交易金额,Remark AS 备注
         FROM TradeInfo 
         WHERE CardNo=@cardNo AND TradeDate >= @searchStartDate
              AND TradeDate <= @searchEndDate
      END
GO
EXEC usp_CheckSheet '1010357612345678','2009-11-02','2009-11-04'


--统计未发生交易的账户----------------------------------------------

IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_getWithoutTrade' )
   DROP PROCEDURE usp_getWithoutTrade
GO
CREATE PROCEDURE usp_getWithoutTrade
   @startDate datetime  =NULL,
   @endDate datetime =NULL
AS
   IF(@startDate IS NULL)
      BEGIN
         SET @startDate = '2009-11-01'
      END
   IF(@endDate IS NULL)
      BEGIN
         SET @endDate = GETDATE()
      END
   SELECT UserName AS 客户姓名,CardNo AS 身份证号,Telephone AS 电话,[Address] AS 地址
   FROM CardInfo
   WHERE CardNo NOT IN (SELECT CardNo FROM TradeInfo WHERE TradeDate BETWEEN @startDate AND @endDate)
GO

EXEC usp_getWithoutTrade

--统计银行卡交易量和交易额---------------------------------------------

IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_getTradeInfo' )
   DROP PROCEDURE usp_getTradeInfo
GO
CREATE PROCEDURE usp_getTradeInfo
   @district nvarchar(20) =NULL,
   @startDate datetime  =NULL,
   @endDate datetime =NULL
AS
   IF(@startDate IS NULL)
      BEGIN
         SET @startDate = '2009-01-01'
      END
   IF(@endDate IS NULL)
      BEGIN
         SET @endDate = GETDATE()
      END
   PRINT '统计银行卡交易量和交易额'
   PRINT ''
   PRINT '起始日期:'+CONVERT(varchar(20),@startDate,102)+'  截止日期:'+CONVERT(varchar(20),@endDate,102)
   PRINT '-----------------------------------------------------------------------------------------'
   DECLARE @inCount int
   DECLARE @outCount int
   --DECLARE @sumCount int
   DECLARE @inMoney decimal(10,2)
   DECLARE @outMoney decimal(10,2)
   --DECLARE @spareMoney decimal(10,2)
   IF(@district IS NULL) 
      BEGIN--没选地区 统计所有的
         SELECT @inCount=COUNT(*) FROM TradeInfo 
            WHERE TradeType = '存入' AND TradeDate BETWEEN @startDate AND @endDate
         SELECT @inMoney=SUM(TradeMoney) FROM TradeInfo 
            WHERE TradeType = '存入' AND TradeDate BETWEEN @startDate AND @endDate
         SELECT @outCount=COUNT(*) FROM TradeInfo
            WHERE TradeType = '支取' AND TradeDate BETWEEN @startDate AND @endDate
         SELECT @outMoney=SUM(TradeMoney) FROM TradeInfo
            WHERE TradeType = '支取' AND TradeDate BETWEEN @startDate AND @endDate
      END 
   ELSE
      BEGIN
         SELECT @inCount=COUNT(*) FROM TradeInfo 
            WHERE TradeType = '存入' AND TradeDate BETWEEN @startDate AND @endDate
               AND CardNo IN (SELECT CardNo FROM CardInfo WHERE [Address] LIKE '%'+@district+'%')
         SELECT @inMoney=SUM(TradeMoney) FROM TradeInfo 
            WHERE TradeType = '存入' AND TradeDate BETWEEN @startDate AND @endDate
               AND CardNo IN (SELECT CardNo FROM CardInfo WHERE [Address] LIKE '%'+@district+'%')
         SELECT @outCount=COUNT(*) FROM TradeInfo
            WHERE TradeType = '支取' AND TradeDate BETWEEN @startDate AND @endDate
               AND CardNo IN (SELECT CardNo FROM CardInfo WHERE [Address] LIKE '%'+@district+'%')
         SELECT @outMoney=SUM(TradeMoney) FROM TradeInfo
            WHERE TradeType = '支取' AND TradeDate BETWEEN @startDate AND @endDate
               AND CardNo IN (SELECT CardNo FROM CardInfo WHERE [Address] LIKE '%'+@district+'%')
      END
   PRINT '存入笔数:'+CONVERT(varchar(10),@inCount)+'  存入金额:'+CONVERT(varchar(10),@inMoney)
   PRINT '支取笔数:'+CONVERT(varchar(10),@outCount)+'  支取金额:'+CONVERT(varchar(10),@outMoney)
   PRINT '-----------------------------------------------------------------------------------------'
   PRINT '发生笔数:'+CONVERT(varchar(10),@inCount+@outCount)+'  支取金额:'+CONVERT(varchar(10),@inMoney-@outMoney)
GO

EXEC usp_getTradeInfo

--用例7  利用事务实现较完整数据更新--------------------------------------------

IF EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_tradefer' )
   DROP PROCEDURE usp_tradefer
GO
CREATE PROCEDURE usp_tradefer
   @outCardNo nvarchar(20),
   @outCardPswd nvarchar(20),
   @outCardMoney decimal(10,2),
   @inCardNo nvarchar(20)
AS
   DECLARE @n int
   SET @n = 0
   BEGIN TRANSACTION
      PRINT '开始转账,请稍后....'
      EXEC usp_takeMoney @outCardNo,@outCardMoney,@outCardPswd
      SET @n=@n+@@ERROR
      EXEC usp_takeMoney @inCardNo,@outCardMoney
      SET @n=@n+@@ERROR
      PRINT '转账成功!'

      DECLARE @date datetime
      DECLARE @nowDate datetime
      SET @date = DATEADD(mi,-30,GETDATE())
      SET @nowDate = DATEADD(mi,10,GETDATE())
      PRINT '打印转出账户对账单'
      PRINT '--------------------------'
      EXEC usp_CheckSheet @outCardNo,@date,@nowDate
      SET @n=@n+@@ERROR
      PRINT '打印转入账户对账单'
      PRINT '--------------------------'
      EXEC usp_CheckSheet @inCardNo,@date,@nowDate
      SET @n=@n+@@ERROR

   IF (@n = 0)
      BEGIN
         COMMIT TRANSACTION
      END
   ELSE
      BEGIN
         ROLLBACK TRANSACTION
      END
GO

EXEC usp_tradefer '1010357612345678','123456',200,'1010357612121130'
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容