SQLServer中临时表的一则使用

1.SQLServer的创建脚本如下:

USE [master]
GO

/****** Object:  Database [test]    Script Date: 10/29/2009 17:43:10 ******/
CREATE DATABASE [test] ON  PRIMARY
( NAME = N'test', FILENAME = N'D:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/test.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON
( NAME = N'test_log', FILENAME = N'D:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/test_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO

ALTER DATABASE [test] SET COMPATIBILITY_LEVEL = 100
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [test].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

ALTER DATABASE [test] SET ANSI_NULL_DEFAULT OFF
GO

ALTER DATABASE [test] SET ANSI_NULLS OFF
GO

ALTER DATABASE [test] SET ANSI_PADDING OFF
GO

ALTER DATABASE [test] SET ANSI_WARNINGS OFF
GO

ALTER DATABASE [test] SET ARITHABORT OFF
GO

ALTER DATABASE [test] SET AUTO_CLOSE OFF
GO

ALTER DATABASE [test] SET AUTO_CREATE_STATISTICS ON
GO

ALTER DATABASE [test] SET AUTO_SHRINK OFF
GO

ALTER DATABASE [test] SET AUTO_UPDATE_STATISTICS ON
GO

ALTER DATABASE [test] SET CURSOR_CLOSE_ON_COMMIT OFF
GO

ALTER DATABASE [test] SET CURSOR_DEFAULT  GLOBAL
GO

ALTER DATABASE [test] SET CONCAT_NULL_YIELDS_NULL OFF
GO

ALTER DATABASE [test] SET NUMERIC_ROUNDABORT OFF
GO

ALTER DATABASE [test] SET QUOTED_IDENTIFIER OFF
GO

ALTER DATABASE [test] SET RECURSIVE_TRIGGERS OFF
GO

ALTER DATABASE [test] SET  DISABLE_BROKER
GO

ALTER DATABASE [test] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO

ALTER DATABASE [test] SET DATE_CORRELATION_OPTIMIZATION OFF
GO

ALTER DATABASE [test] SET TRUSTWORTHY OFF
GO

ALTER DATABASE [test] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO

ALTER DATABASE [test] SET PARAMETERIZATION SIMPLE
GO

ALTER DATABASE [test] SET READ_COMMITTED_SNAPSHOT OFF
GO

ALTER DATABASE [test] SET HONOR_BROKER_PRIORITY OFF
GO

ALTER DATABASE [test] SET  READ_WRITE
GO

ALTER DATABASE [test] SET RECOVERY FULL
GO

ALTER DATABASE [test] SET  MULTI_USER
GO

ALTER DATABASE [test] SET PAGE_VERIFY CHECKSUM 
GO

ALTER DATABASE [test] SET DB_CHAINING OFF
GO


2.SQL脚本如下:

--变量定义开始

--以下是外部变量的定义


--以下是内部变量的定义
--整体的记录数
declare @Recordcount int
--子记录数
declare @RecordIDCount int
declare @开始时间 date
declare @结束时间 date
declare @利息开始时间 date
declare @利息结束时间 date
declare @ID int
declare @maxID int
--变量定义结束

--判断临时表是否存在如果存在则删除
if OBJECT_ID('tempdb.dbo.#t1') is not null
begin
    drop table  #t1
end
--如果不存在,则从新创建临时表
    create Table #t1 (identityID int identity(1,1),id int,姓名 nvarchar(50),开始时间 date ,结束时间 date ,本金 float,实际利息 float,利息开始时间 date,利息结束时间 date, 利率 float,计息月份 int)
    insert into #t1
    select t1.*, t2.开始时间,t2.结束时间,t2.利率,t2.计息月份 from Table1 t1 left join Table2 t2 on t1.开始时间 between t2.开始时间 and t2.结束时间 or t1.结束时间 between t2.开始时间 and t2.结束时间



--通过计算更新临时表中相应的计息月份

--判断记录数是否为空
set @Recordcount = (select COUNT(identityID) from #t1)
if    @Recordcount > 0
begin
    set @ID = (select MIN(identityID) from #t1)
    set @maxID = (select max(identityID) from #t1)
    while @ID<=@maxID
        begin
            --判断记录是否存在
            set @RecordIDCount = (select COUNT(identityID) from #t1 where identityID=@ID)
            if @RecordIDCount >0
            begin
                set @开始时间 = (select 开始时间 from #t1 where identityID = @ID)
                set @结束时间 = (select 结束时间 from #t1 where identityID = @ID)
                set @利息开始时间 = (select 利息开始时间 from #t1 where identityID = @ID)
                set @利息结束时间 = (select 利息结束时间 from #t1 where identityID = @ID)
               
                if @开始时间 < @利息开始时间
                begin
                    if @结束时间 < @利息结束时间
                    begin
                        --时间段是从:@利息开始时间 -- @结束时间
                        update #t1 set 计息月份 = (SELECT ((DATEPART(YEAR,@结束时间)*12+DATEPART(MONTH,@结束时间))-DATEPART(YEAR,@利息开始时间)*12+DATEPART(MONTH,@利息开始时间))) where identityID=@ID
                    end
                    else if @结束时间 > @利息结束时间
                    begin
                        --时间段是从:@利息开始时间 -- @利息结束时间
                        update #t1 set 计息月份 = (SELECT ((DATEPART(YEAR,@利息结束时间)*12+DATEPART(MONTH,@利息结束时间))-DATEPART(YEAR,@利息开始时间)*12+DATEPART(MONTH,@利息开始时间))) where identityID=@ID
                    end
                end
                else if    @开始时间 > @利息开始时间
                begin
                    if @结束时间 < @利息结束时间
                    begin
                        --时间段是从:@开始时间 -- @结束时间
                        update #t1 set 计息月份 = (SELECT ((DATEPART(YEAR,@结束时间)*12+DATEPART(MONTH,@结束时间))-DATEPART(YEAR,@开始时间)*12+DATEPART(MONTH,@开始时间))) where identityID=@ID
                    end
                    else if @结束时间 > @利息结束时间
                    begin
                        --时间段是从:@开始时间 -- @利息结束时间
                        update #t1 set 计息月份 = (SELECT ((DATEPART(YEAR,@利息结束时间)*12+DATEPART(MONTH,@利息结束时间))-DATEPART(YEAR,@开始时间)*12+DATEPART(MONTH,@开始时间))) where identityID=@ID
                    end
                end
            end
           
            set @ID = @ID+1
        end
end


select SUM(本金*利率*计息月份) from #t1 where 姓名='张三'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值