电信话单查询模块开发心得(临时视图的使用)

前个星期,在女友的关系介绍下,找到了项目,就是开发一个话单查询子系统,由于是电信级别的东西,数据量自然是大了,日数据量就有500万左右,听了都是吓人的(具体我也不清楚,因为是负责人说的).
 项目拿到了,碰到的首要问题就是:如何跨多表查询?
例如:2006-5-1日的数据就存在 F_20050502中
            2006-5-2日的数据就存在 F_20050502中
   2006-5-3日的数据就存在 F_20050503中
依次类推...
   而,用户查询的时候,又需要从多个表中查询数据.例如:查2006-5-1 到 2006-5-10的数据,就要跨10个表.(真的是很麻烦)
经过2天的思索,我想出了以下的方案.用存储过程实现,通过传入 start_time (起始时间) end_time(结束时间),用循环查询先确定表是否存在,然后动态生成一个 select 语句.用 union all 把这些个select语句组合在一起.代码如下:
declare @sd datetime
declare @ed datetime
declare @td datetime
declare @NN int
declare @d int
declare @sql varchar(4000)
declare @T varchar(255)
set @sd=@start_time--CAST('2006-05-01 12:35:29.998' AS datetime)
set @ed=@end_time --CAST('2006-05-03 12:35:29.998' AS datetime)
--set @td=@sd
set @d=datediff(DD,@sd,@ed)
print @d
print @td

set @NN=0
set @sql=' '

DECLARE @FLAG  INT
SET @FLAG=0

-- 生成待查询的数据表 集合

while @NN<=@d
begin
  set @td=dateadd(DD,@NN,@sd)
  set @NN=@NN+1
  SET @T=DATEPART(YYYY,@td)
  if DATEPART(MM,@td)<10
     set @T=@T+'0'+cast(DATEPART(MM,@td) as char(1))
  else
     set @T=@T+CAST(DATEPART(MM,@td) AS CHAR(2))
  if DATEPART(DD,@td)<10
     set @T=@T+'0'+cast(DATEPART(DD,@td) as char(1))
  else
     set @T=@T+CAST(DATEPART(DD,@td) AS CHAR(2))
 SET @T='FACT_'+@T
 --PRINT @T   
 if exists (select * from sysobjects where id = object_id(@T) and OBJECTPROPERTY(id, 'IsUserTable') = 1)
 BEGIN
  --PRINT '-----'
  PRINT @T
  --PRINT '!----!'
  --考虑时间范围 小时/分
  IF @FLAG=0
  begin
     SET @SQL='SELECT '+@fileds+' FROM '+@T+' where start_time>='''+cast(@start_time as varchar(50))+''' and '+@query
     SET @FLAG=1
  end
  ELSE
  begin
    SET @SQL=@SQL+' UNION ALL SELECT '+@fileds+' FROM '+@T+' where '+@query
  end
 END
 
end

  到此处,@SQL里,已经是多个表查询的语句了.再在外面套上一个 select 语句就可以查询.
  如: @SQL='select * from ('+@SQL+')'就可以了
      最后exec(@SQL)就可以返回数据了.

不过,经过实际运用,该方法不太好,生成的sql 语句太长,而且是用不方便.于是我又想出了第2种办法,就是"临时视图",为什么有"临时表"就不能有"临时视图"呢?
  采用了该方法后,程序大大简化了.而且使用方便了,至于效率吗(机器效率)应该是低点.
具体思路是:
   程序运行时,先确定范围,然后根据范围自动创建一个视图,提供给后续查询用,查询完毕后,用drop把视图删除.
          具体如下
while @NN<=@d
begin
  set @td=dateadd(DD,@NN,@sd)
  set @NN=@NN+1
  SET @T=DATEPART(YYYY,@td)
  if DATEPART(MM,@td)<10
     set @T=@T+'0'+cast(DATEPART(MM,@td) as char(1))
  else
     set @T=@T+CAST(DATEPART(MM,@td) AS CHAR(2))
  if DATEPART(DD,@td)<10
     set @T=@T+'0'+cast(DATEPART(DD,@td) as char(1))
  else
     set @T=@T+CAST(DATEPART(DD,@td) AS CHAR(2))
 SET @T='FACT_'+@T
 
 --PRINT @T   
 if exists (select * from sysobjects where id = object_id(@T) and OBJECTPROPERTY(id, 'IsUserTable') = 1)
 BEGIN
   set @FLAG=@FLAG+1
   IF @FLAG=1
      begin
        set @sql='select * from '+@T
      end
  ELSE
      begin     
         set @sql=@sql+' union all select * from '+@t
      end
 END  
end

if @FLAG=0
begin
 select 0
 return -1
end
--创建一个零时试图
declare @tmpView varchar(4000)

set @tmpView='tmpV'+cast(DATEPART(YYYY,getDate()) as varchar(4))+
cast(DATEPART(MM,getDate()) as varchar(2))+
cast(DATEPART(DD,getDate()) as varchar(2))+
cast(DATEPART(HH,getDate()) as varchar(2))+
cast(DATEPART(SS,getDate()) as varchar(2))+
cast(DATEPART(MS,getDate()) as varchar(4))

set @sql='CREATE  VIEW '+@tmpView+ ' as '+@sql
print @sql

exec(@sql)
--临时视图创建完毕

到此视图@tmpView 就创建好了.后面的查询都可以直接引用 @tmpView了.

在查询结束后,只需要在执行下面的语句即可
set @sql='drop view '+@tmpView
exec(@sql)

项目开发笔记(临时视图)-1相关推荐

  1. [Openwrt 项目开发笔记]:Samba服务vsFTP服务(四)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 在上一节中,我们讲述了如何在路由器上挂载U盘,以 ...

  2. 京东投票项目开发笔记

    京东投票项目开发笔记 打开项目 $yarn install / $ npm install: 跑环境(把项目依赖的插件进行安装) $node admin.js: 启服务(把自己的计算机作为服务器,创建 ...

  3. 京东抽奖项目开发笔记

    京东抽奖项目开发笔记 前言: 这是一个独立项目,这个项目会由我们四个人来一起完成,所以首先就要分工合作,我是写前端的,所以我会先把基本的页面写出来 1.注册页 这是注册页的代码 <!DOCTYP ...

  4. 尚硅谷前端项目开发笔记

    尚硅谷前端项目开发笔记 B站视频直达,这个项目亮点在于所有 API 请求都并非在组件内编写,而是在组件内使用this.$store.dispatch() 派发任务,再由 Vuex(actions.mu ...

  5. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  6. Vue PC商城项目开发笔记与问题汇总

    Vue PC商城项目开发笔记与问题汇总 负责PC端商城项目,这也是人生第一个真正的项目.刚做了一天,就遇到不少问题,在这里列出自己的问题与解决办法,与大家交流,提升自己,希望以后不会掉进同一个坑里. ...

  7. 天天生鲜项目开发笔记

    天天生鲜项目开发笔记 说在前面的话 大学四年,忙忙碌碌,什么都学了,又好像什么都没学,总之要毕业了,毕设题目是"生鲜配送系统",B站上找到了一个天天生鲜的项目开发教程,之后文章记录 ...

  8. iOS项目开发实战——设置视图的透明度改变动画

    在iOS中 ,透明度的改变可以让View视图以一种渐变的效果动态的出现或者消退,非常有意思.这里我们将会对一个View控件的色块执行透明度改变的动画.关于其他的动画效果可以参考我的其他几篇博客< ...

  9. 微信公众号项目开发笔记 一

    最近换了新工作,刚刚开始上班.需要为公司开发一个微信公众号的功能,对接系统erp接口.做一个物流信息手机签收的功能.使用.net MV4 进行项目开发,引用第三方库做微信公众号配置功能.因为之前做过公 ...

最新文章

  1. Java多线程初学者指南(10):使用Synchronized关键字同步类方法
  2. 深度学习的一些经验总结和建议| To do v.s Not To Do
  3. jquery 键盘事件
  4. iQOO 8系列即将登场:首发三星E5 AMOLED全面屏
  5. smart模版学习笔记一
  6. 递归算法1加到100_「算法」北京大学算法基础—递归(1)
  7. LeetCode刷题系列(三)排序
  8. 最新xml注释顶格问题的解决方法
  9. 酒店IPTV数字电视系统解决方案
  10. Win10系统安装SQL2008 R2详细步骤+图片+常见问题及解决方法
  11. 20年中国人均GDP排名变化
  12. taskmgr多开补丁
  13. 若依框架前端菜单生成,权限标识,路由地址
  14. iOS开发模拟网络状态差进行调试
  15. 地铁译:Spark for python developers --- 搭建Spark虚拟环境1
  16. dz程序上传服务器的位置,dz手机端上传到远程服务器
  17. 更高的抵押贷款利率对美国房地产市场意味着什么?
  18. 拿番茄炒鸡蛋来讲解一下大数据项目的流程
  19. 计算机共享有哪些方式,信息共享的方式有哪些
  20. 【笨木头Lua专栏】基础补充04:迭代器初探

热门文章

  1. 计算机图形学算法【1】——直线画法(数值微分法)
  2. 计算机二级office——word字处理第一套习题
  3. 关于《数据结构与算法JavaScript描述》这本书
  4. 《Spring揭秘》读后感(给你们强烈安利这本书)
  5. C语言编程练习——循环结构(一)
  6. JavaScript03
  7. 搭建Android开发环境Win7-64位
  8. 时空穿梭 探寻高端存储架构的前世今生
  9. 虚拟机nat方式联网
  10. 招远一职专计算机专业都学什么,招远一职专计算机专业技能指导教师李欣经