`
jljlpch
  • 浏览: 324006 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

T-SQL 存储过程

阅读更多

prk/彭仁夔      08-09-02        转载注明出处。

在开发中,我们经常要用到这样的统计

 

根据用户输入的日期,把每个月的备份表的数据和正在使用的表中的综合起来统计。假如2008-05-11到2008-08-01,那么就包含5,6,7,8四张备份表还有正在使用的表,加起5张表。这是要统计的所有的数据。

 

对于统计又有要求,分情况来统计各种情况的总计,但是有的特殊情况要统计其明细。

如下图:

 T-sql日期转换不兼容。还有对运行的sql的长度也有一定的限制。

 

 

prk/彭仁夔      08-09-02        转载注明出处。

 

 

ALTER PROCEDURE [dbo].[UP_TSMReceivedDailyReport]
@StartTime varchar(100),
@EndTime    varchar(100),
@OrgAddrs  varchar(1000)='',
@MsgType_IDs  varchar(1000)=''
 AS 
     declare @where  varchar(1000)
     declare @startMonth  int 
     declare @endMonth int 
     declare @tempMonth int
     declare @generalSql varchar(1000)
     declare @tempSql varchar(1000)
     declare @tempSql1 varchar(3000)
     declare @tempTotal varchar(3000)
     declare @tempUndeal varchar(3000)
     declare @tempdealing varchar(3000)
     declare @tempdealed varchar(3000)
     declare @temp1 varchar(3000)
     declare @temp2 varchar(3000)
     declare @temp3 varchar(3000)
     declare @temp4 varchar(3000)
     declare @mm int
     declare @mm1 int
  /*
    declare @StartTime varchar(100)
    declare @EndTime    varchar(100)
    declare @OrgAddrs  varchar(1000)
    declare @MsgType_IDs  varchar(1000)
 
   set @StartTime ='2008-05-05'
   set  @EndTime  ='2008-07-07'
   set  @OrgAddrs =''
   set  @MsgType_IDs =''
*/
    set  @startMonth=Month(@StartTime)
    set  @endMonth =Month(@EndTime)
    set  @tempMonth=@startMonth
    set  @tempSql=' '
    set  @tempSql1=' '
    set  @temp1=' '
    set  @temp2=' '
    set  @temp3=' '
    set  @temp4=' '
    set  @where=' where recvTime>='''+CAST(@StartTime as varchar(20))+''' and recvTime<='''+CAST(@EndTime as varchar(20))+'''  '

    if @OrgAddrs!=''
     begin
      set @where=@where+' '+ ' and OrgAddr in '+@OrgAddrs+' '
      end
    
    if @MsgType_IDs!=''
       begin
       set @where=@where+' '+ ' and MsgType_ID in '+@MsgType_IDs+' '
       end
     print @where
     set @generalSql=' select RecvSM_ID,User_ID,MsgType_ID,OrgAddr ,DestAddr, cast(RecvTime as DateTime) RecvTime,
       SM_Content,DealSign,cast(DealTime as DateTime) DealTime,IsWait,ReMsgType_ID,SendSM_Content   
         from T_SMReceived '+@where+' and DealSign<>4  and (DealSign<>8 and iswait<>0) and (DealSign<>3 and IsWait<>0)'
       print @generalSql

create table #temp  (RecvSM_ID int, 
                      User_ID int, 
                      MsgType_ID int, 
                     OrgAddr varchar(128), 
                     DestAddr varchar(128), 
                     RecvTime datetime, 
                     SM_Content varchar(6000), 
                     DealSign tinyint, 
                     DealTime datetime,
                     IsWait bit, 
                     ReMsgType_ID int ,
                     SendSM_Content varchar(6000) )
   
    insert into #temp exec (@generalSql)
  
while @tempMonth<=@endMonth
       begin      
   set @tempSql='select RecvSM_ID,User_ID,MsgType_ID,OrgAddr ,DestAddr, cast(RecvTime as DateTime) RecvTime,
       SM_Content,DealSign,cast(DealTime as DateTime) DealTime,IsWait,ReMsgType_ID,SendSM_Content   from T_SMReceived_'+Cast(@tempMonth as varchar(2))+'  '+@where+' '
     insert into #temp  exec (@tempSql)       
       
     set @tempMonth= @tempMonth+1
     end   
     
      select @mm= count(*) from #temp
    print 'the temp table have:'+cast(@mm as varchar(100))

     set @temp1='select  msgtype_id  ,convert(varchar(10),recvtime,120) recvtime , total=count(*)     from #temp  '
     set @temp2=' group by  convert(varchar(10),recvtime,120), msgtype_id  '
     set @tempTotal = @temp1+''+@temp2
     print @tempTotal
     set @tempUndeal = @temp1+' where (iswait=1 and DealSign=0) or DealSign=2  or (iswait=1 and DealSign=8) '+@temp2
     print @tempUndeal
     set @tempdealing =@temp1+' where (iswait=1 and DealSign=1) or (iswait=1 and DealSign=9) '+@temp2
     print @tempdealing
     set @tempdealed =@temp1+' where (iswait=0 and DealSign=3) or (iswait=0 and DealSign=4) '+@temp2
     print @tempdealed

     set @temp3='select a.MsgType_ID , a.RecvTime,a.total,
     (select undeal= case  when b.total IS NULL  then 0 else b.total end) undeal ,
     (select dealing= case  when c.total IS NULL  then 0 else c.total end) dealing,
     (select dealed= case  when d.total IS NULL  then 0 else d.total end) dealed,
      undealDetail=null,dealingDetail=null,dealedDetail=null from ('+@tempTotal+') a left join ('
        +@tempUndeal+') b on a.msgtype_id=b.msgtype_id and a.recvtime=b.recvtime left join ('+
        @tempdealing+' ) c on a.msgtype_id=c.msgtype_id and a.recvtime=c.recvtime left join ( '
        +@tempdealed+') d on a.msgtype_id=d.msgtype_id and a.recvtime=d.recvtime'
    
   print '#temp1 SQL: '+ @temp3

create table #temp1  (
                     MsgType_ID int,                      
                     RecvTime varchar(10), 
                     total int,
                     undeal int,                      
                     dealing int,                     
                     dealed int,
                     undealDetail varchar(1000),
                     dealingDetail varchar(1000),
                     dealedDetail varchar(1000),                    
                     ) 

 insert into #temp1   exec(@temp3)


      select @mm1= count(*) from #temp1
print 'the #templ have :'+cast(@mm1 as varchar(100))

declare finalReport cursor 
  for select MsgType_ID,convert(varchar(10),recvtime,120) RecvTime ,dealed from #temp1
   open finalReport

     declare @MsgType_IDf int
     declare @RecvTimef varchar(10)
     declare @dealedf int
      print  'start tatal one record';
     fetch next from finalReport into @MsgType_IDf, @RecvTimef ,@dealedf
      while(@@fetch_status=0)
         begin

             declare my_cursor cursor 
              
              for  select a.msgtype_id ,a.recvtime,a.size,a.reMsgType_ID,b.ReMsgTypeName from
                     (select msgtype_id,count(*) size, convert(varchar(10),recvtime,120) recvtime,reMsgType_ID from #temp 
                       where convert(varchar(10),recvtime,120)=@RecvTimef and msgtype_id=@MsgType_IDf and (iswait=0 and (DealSign=3 or DealSign=4))   group by  convert(varchar(10),recvtime,120), msgtype_id,reMsgType_ID) a left join T_ReMsgType b
                      on a.reMsgType_ID=b.reMsgType_ID order by a.msgtype_id

                open my_cursor

                 declare @msgtype_id int
                 declare @recvtime varchar(10)
                 declare @reMsgType_ID int
                 declare @ReMsgTypeName varchar(500)
                 declare @dealedDetail varchar(500)
                 declare @size int
                 declare @flag int

                 set @flag=0
                 set @dealedDetail='总数:'+Cast(@dealedf as varchar(5))+' (其中 '
                  print  'start deal one record';
               fetch next from my_cursor into @msgtype_id,@recvtime,@size,@reMsgType_ID,@ReMsgTypeName
                 while(@@fetch_status=0)
                       begin

                         set @dealedDetail= @dealedDetail+@ReMsgTypeName+': '+                 
                         Cast((select undeal= case  when @size IS NULL  then 0  else @size end) as varchar(5))+','
                          set @flag=1  
                  
                         fetch next from my_cursor into @msgtype_id,@recvtime,@size,@reMsgType_ID,@ReMsgTypeName
                       end

                   if @flag=0
                       begin
                       set @dealedDetail=substring(@dealedDetail,0,len(@dealedDetail)-3)
                       end
                    else 
                       begin
                         set @dealedDetail=substring(@dealedDetail,0,len(@dealedDetail))+')'
                       end
                close my_cursor 
                DEALLOCATE my_cursor
          update #temp1 set dealedDetail= @dealedDetail  where convert(varchar(10),recvtime,120)=@RecvTimef and msgtype_id=@MsgType_IDf 
            print  'have update one record';

     fetch next from finalReport into @MsgType_IDf, @RecvTimef ,@dealedf
          end
    close finalReport
    DEALLOCATE finalReport

 select c.*,d.MsgTypeName from #temp1 c left join T_MsgType d on c.msgtype_id=D.msgtype_id  order by c.RecvTime,c.msgtype_id

 

 

  • 大小: 158 KB
分享到:
评论

相关推荐

    sql server2008轻松编写t-sql存储过程

    本文将重点介绍如何在SQL Server 2008环境中轻松编写T-SQL存储过程,并通过具体的示例来展示其实现方法。 #### 二、SQL Server Management Studio (SSMS) 在SQL Server 2008中,SQL Server Management Studio ...

    T-sql编程存储过程

    T-sql编程存储过程T-sql编程存储过程T-sql编程存储过程T-sql编程存储过程T-sql编程存储过程

    sql server 2012 T-SQl基础教程 源码和示例数据库

    本教程专注于Microsoft SQL Server 2012中的Transact-SQL(T-SQL)语言,这是SQL Server的主要查询语言,用于数据操作、查询、存储过程和数据库对象的编程。T-SQL是SQL Server开发者的核心技能,无论你是新手还是...

    T-SQL课件(介绍了T-SQL的一些基本知识)

    T-SQL提供了SQL的标准功能,如数据定义(DDL)、数据操纵(DML)和数据控制(DCL),同时增加了更多的编程元素,使其成为一种功能强大的非过程化编程语言。 1. T-SQL语言基础知识: - T-SQL是SQL的增强版,包含了...

    T-SQL语言基础 T-SQL语言基础

    局部变量的生命周期局限于定义它们的批处理或存储过程,因此它们通常用于存储临时数据。要声明局部变量,需要使用`DECLARE`语句,之后可以使用`SET`或`SELECT`来为变量赋值。例如: ```sql DECLARE @myvar char(20)...

    Inside Microsoft SQL Server 2008 T-SQL Programming.pdf

    它不仅覆盖了T-SQL编程的基础知识,还深入探讨了许多高级主题,如存储过程、触发器、函数等,同时还提供了大量的性能优化技巧和最佳实践建议。对于希望提升自己SQL Server技能的开发者和DBA来说,这是一本非常有价值...

    T-sql的存储过程

    **T-SQL存储过程详解** T-SQL,全称Transact-SQL,是SQL Server数据库管理系统中的编程语言,它是标准SQL的扩展,主要用于管理和操作Microsoft SQL Server数据库。T-SQL的强大之处在于它允许用户编写复杂的数据库...

    Inside Microsoft SQL Server 2008 T-SQL Programming

    T-SQL,即Transact-SQL,是SQL的一个扩展,主要用于微软的SQL Server系统中,用于数据查询、更新、插入和删除,以及复杂的存储过程和触发器的编写。 在SQL Server 2008版本中,T-SQL得到了许多增强和改进,这本书将...

    SQL、T-SQL与PL-SQL的区别

    SQL、T-SQL与PL-SQL的区别 SQL(Structured Query Language)是结构化查询语言,是负责与ANSI(美国国家标准学会)维护的数据库交互的标准语言。它是关系数据库的标准语言,已被众多商用DBMS产品所采用,使得它已...

    T-SQL示例大全(全是T-SQL语句 )

    2. 存储过程:存储过程是一组预先编译好的T-SQL语句,可以接受参数,返回值,甚至可以包含事务处理。创建存储过程的SQL语句是`CREATE PROCEDURE 存储过程名 AS BEGIN...END`,调用存储过程使用`EXEC 存储过程名 ...

    Microsoft SQL Server 2008技术内幕:T-SQL查询_源代码及附录.zip

    T-SQL是SQL Server数据库管理系统的核心语言,用于数据操作、查询、存储过程编写以及数据库管理等任务。这本书的源代码及附录内容提供了丰富的实例和详尽的解释,帮助读者深化对T-SQL的理解和应用。 1. **T-SQL查询...

    Microsoft SQL Server 2008技术内幕:T-SQL查询.pdf

    T-SQL是微软SQL Server数据库管理系统的核心语言,用于数据操作、查询、存储过程编写以及数据库对象的管理。本书详细阐述了如何有效地利用T-SQL来处理和分析数据。 在SQL Server 2008中,T-SQL得到了进一步的增强和...

    T-SQL用户指南&T-SQL用户手册打包下载

    T-SQL不仅仅是SQL的基础语法,它还提供了更丰富的功能,如流程控制、变量定义、函数使用、存储过程以及触发器等,使得数据库管理与开发更为高效和灵活。 1. **基本查询语句**:T-SQL的基础在于查询,SELECT语句用于...

    Microsoft SQL Server 2005技术内幕:T-SQL查询的源代码

    T-SQL(Transact-SQL)是Microsoft SQL Server数据库管理系统中用于数据操作、查询、存储过程和数据库控制的一种扩展SQL语法。此书主要关注于如何高效地使用T-SQL进行数据检索和处理,为数据库管理员和开发人员提供...

    17套T-SQL试题

    T-SQL包含许多高级功能,如存储过程、触发器、函数(内置和用户定义)、视图、事务和批处理。存储过程是预编译的SQL代码集合,可提高性能和代码重用;触发器允许在数据更改前后自动执行操作;函数可以返回单个值或...

    [电子书] SQL Server 2012 T-SQL 实用技巧 (英文版)

    SQL(Structured Query Language)是用于管理和处理关系数据库的强大工具,而T-SQL(Transact-SQL)是SQL Server的扩展,增加了诸如事务处理、存储过程和触发器等高级功能。对于SQL Server 2012,T-SQL的掌握至关...

    MICROSOFT SQL SERVER 2008技术内幕:T-SQL语言基础.pdf

    存储过程是预先编译并存储在数据库中的一个或多个T-SQL语句,可以被客户端程序通过名称调用执行。触发器是一种特殊类型的存储过程,它会在数据表上发生数据修改事件(如INSERT、UPDATE或DELETE)时自动执行。 十、...

    Microsoft SQL Server 2008 T-SQL Fundamentals

    在T-SQL中,存储过程和触发器是两个重要的高级概念。它们允许用户编写可重用的代码块,并在特定事件发生时自动执行。存储过程可以提高效率,减少网络流量,而触发器则可以实现数据的完整性约束。书中的这部分内容将...

    《T-SQL 2008 入门》[PDF]

    在T-SQL的进阶部分,读者将接触到存储过程和函数的创建与调用,这在实际开发中非常常用。存储过程可以封装复杂的逻辑,提高代码复用性,而函数则能返回单一值,便于在查询中使用。此外,触发器的概念也会被讲解,它...

    T-SQL程序设计

    T-SQL 程序设计是指使用 T-SQL 语言来设计和实现数据库应用程序的过程。 变量的定义和赋值是 T-SQL 程序设计的基础。变量是用于存储数据的容器,变量的定义包括变量名称、数据类型和初始值。例如,declare @student...

Global site tag (gtag.js) - Google Analytics