Sql临时表在存储过程中的应用

前两天在项目中碰到这样的问题: 有多个结构相同的表,要求在这些表的累加结果集中进行数据统计和查询.
在Googel上找了半天相关资料,硬是没找到我想要的解决办法,咱在这里也不是批评那些抄来抄去的人,乱糟糟的瞎起哄!
由于怕数据量过大而导致程序性能低下,所以当初在项目初期设计表的时候,把一部分类型相同的数据分多个表来存放了,这样导致在统计查询的时候变的复杂了,原来只需要一个查询语句就可以出结果的,可是现在变的复杂去了.
例子描述:

table_a和table_b的结构是相同的,如下:
id                          type                Pro_Sort            Content

目的是要把两个表的所有数据都累加起来,然后再对其结果进行统计查询分析.

费了老半天劲找资料也没结果,心情极度郁闷!


后又过了多久我也不知道,突然想起以前在Sql Server的联机帮助里看到临时表的概念,突然就来了灵感,看来平时多看点资料到必要时还是挺有帮助的,嘿  嘿!!!
仔细参详了一番,思路渐渐明晰起来,在存储过程里以创建局部临时表的形式把我需要参与统计的这些表的数据都拿出Insert Into给我的新临时表(不要担心这会给服务器带来什么负担,因为只要过程一结束,局部临时表就会自动清除.),然后我就可以对我创建的局部临时表进行统计了,哈哈!想到这里的时候别提有多兴奋了...

下面供上我在项目中用到的代码片段:
程序代码 程序代码
存储过程:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pb_All_Ticket]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[pb_All_Ticket]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


--创建日期:2007/11/26
--功能:以创建临时表的方式,合并所有彩种的代购表数据
--创建人: 程勇
--Msn: chengyong-msn@hotmail.com/QQ:25457788

Create  PROCEDURE pb_All_Ticket
    @CPType int,              --出票类型
    @TicketSort varchar(50),  --彩  种
    @OutBillUser varchar(1000), --出 票 人
    @StartTime varchar(50),   --搜索开始时间
    @EndTime varchar(50),     --搜索结束时间
    @DateType int             --搜索类型:1时间段,2当天,3当月
AS
BEGIN
    Create Table #temptable
    (
        fname varchar(50),
        username varchar(50),
        userid int,
        qinum varchar(50),
        zhushu int,
        buy_time datetime,
        is_fail int,
        is_out int,
        beishu int
    )
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_PlsTicket--排三
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_PlwTicket--排五
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Fc3dTicket--福彩3D
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_QxcTicket--七星彩
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_SsTicket--双色球
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_XwTicket--22x5
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xq29Ticket--29x7
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xq36Ticket--36x7
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_QlcTicket--七乐彩
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_DltTicket--大乐透
    insert into #temptable select fname,username,userid,qinum,zhushu,UserBuyTime,is_fail,is_out,beishu from pb_SfcTicket--胜负彩
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xz6Ticket--新足彩6场半
    insert into #temptable select fname,username,userid,qinum,zhushu,buy_time,is_fail,is_out,beishu from pb_Xz4Ticket--新足彩4场
    
    Declare @tempstr varchar(200)
    Declare @sqlstr varchar(500)
    Set @tempstr = ''
-----------------------------按出票类别:已出/未出/已撤单---------------------------------
    If @CPType<>''
    Begin
        If @CPType = 1
        Set @tempstr = ' and is_out = 0'
        Else If @CPType = 2
        Set @tempstr = ' and is_out = 1'
        Else If @CPType = 3
        Set @tempstr = ' and is_fail = 1'
        Else
        Set @tempstr = ''
    End
-------------------------------按彩种-----------------------------------
    If @TicketSort<>''
    Begin
        Set @tempstr = @tempstr + ' and fname like '''+@TicketSort+'%'''
    End
-------------------------------按时间类型:当天/当月/自定义时间段-----------------------------------
    If @DateType <>''
    Begin
    --按时间段
        If @DateType = 1
        Begin
            If @StartTime<>'' and @EndTime<>''
                Set @tempstr = @tempstr + '  and buy_time between '''+@StartTime+''' and '''+@EndTime+''''
        End
    --按当天时间
        Else If @DateType = 2
        Begin
            Set @tempstr = @tempstr + '  and Convert(varchar(10),buy_time,120) = Convert(varchar(10),getDate(),120)'
        End
    --按当月时间
        Else If @DateType = 3
        Set @tempstr = @tempstr + ' and month(buy_time) = Month(GetDate()) '
    End
------------------------------------按出票人--------------------------------------
    If @OutBillUser<>''
        Begin
        Set @tempstr = @tempstr + @OutBillUser
        End
    Set @sqlstr='Select * From #temptable Where 1=1 '+ @tempstr
    Execute(@sqlstr)
END



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值