当前位置: 首页 > news >正文

20180925 SQL Server游标使用

之前写了一个存储过程

目标: 根据时间,获取指定范围的数据集A, 再从数据集A 中,取出每行数据中的两个时间,卡另外一个B表里面的某列时间范围的值集。得到均值进行配置值比对。

这里有个问题,就是取得B 表的值集是取得不同列,B 表有11列,那么就有11组值集。这里涉及到了行列转换。

最开始的办法: ----》取数据集A -------》循环----------》取数据集B --------》运算+传入列名得到均值----------》 与配置表进行比对

问题在于:1.A 表数据量很大,取2个小时的数据,数据量也在万笔。2. B 表时间段卡的数据量也大,而且列是不指定的,每次执行就需要把所有的列单独导入,很好时间,初步的存储过程写好后,执行时间在10分钟以上。

上面的想法会有一个问题,就是B 表同一个时间段,会根据A表的数据导入多次,这是无意义的动作,因为A表在取数据的时候,已经设置了最小时间。

那么就可以优化,把A 表大于最小时间的数据倒叙,取第一行数据就是最大时间, 再根据最大和最小时间,把B 表里面的数据先通过游标进行11列的行列数据转换,放入一个临时表中,循环A表,再进行Group by 得到11列的所有的avg值,和配置表进行比对。

时间可控制在00:00:02

 

用游标进行循环时,可以取多个值使用:这里方便了限制配置表的条件,和时间范围

  FETCH NEXT FROM teCursor into @STime,@ETime,@Resoa;

还有一个就是B 表的行列转换
没有采用标准的方式,而是用了把列作为变量的形式传入,但是在sql 中select @变量 from表,是不成立的。

只能把语句进行拼接,set 给一个变量@sql,然后使用exec @sql

''InP - BFC_''+'''+@parameterName+''' as ParameterName 

这里就要注意单引号这部分了。

有些小的东西

1. 判断表里面是否有数据,有数据再去处理,没有就继续循环

if exists( select * from #EndData)


2.执行前对临时表进行清理判断,回收

 IF OBJECT_ID('TEMPDB.DBO.#EndData') IS NOT NULL BEGIN DROP TABLE #EndData END

如下为游标的片段,并不能直接使用(切记)因为并没有对所有的变量进行定义

DECLARE teCursor CURSOR FOR(SELECT TrackInTime,TrackOutTime,Recipe FROM #Datatable)
       OPEN teCursor;
       FETCH NEXT FROM teCursor into @STime,@ETime,@Resoa;
        WHILE @@FETCH_STATUS = 0
         BEGIN
             IF OBJECT_ID('TEMPDB.DBO.#EndData') IS NOT NULL BEGIN DROP TABLE #EndData END
             SELECT Dat.*
             INTO #EndData
             FROM (SELECT * FROM #TEST) Dat

        if exists( select * from #EndData)
            begin 
                        print 1
            end
        else 
            begin
                  print 2
            end
             FETCH NEXT FROM teCursor into @STime,@ETime,@Resoa;
         END
       CLOSE teCursor;
             DEALLOCATE teCursor 

 

转载于:https://www.cnblogs.com/Soar-Pang/p/9699763.html

相关文章:

  • 青蛙
  • jQuery介绍
  • SmartPersistenceLayer 3.1 事务处理
  • idea项目结构旁边出现0%classes,0%lines covered
  • 陌生女孩
  • 更简单高效的HTML数据提取-Xpath
  • 唐伯虎之作收录
  • java数据结构---------插入排序的实现
  • Enterprise Library2.0(2):Logging Application Block学习
  • 深入理解.NET Core的基元: deps.json, runtimeconfig.json, dll文件
  • 常见的网站攻击手段和防御方法
  • 致爱我的人和我爱的人
  • attr/attrs模块
  • 关于“当前不会命中断点”
  • 关于sqoop导入数据的时候添加--split-by配置项对sqoop的导入速度的影响。
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CSS实用技巧
  • JAVA并发编程--1.基础概念
  • jdbc就是这么简单
  • MySQL几个简单SQL的优化
  • Ruby 2.x 源代码分析:扩展 概述
  • 蓝海存储开关机注意事项总结
  • 软件开发学习的5大技巧,你知道吗?
  • 使用 Docker 部署 Spring Boot项目
  • 译有关态射的一切
  • 终端用户监控:真实用户监控还是模拟监控?
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #include
  • #include到底该写在哪
  • #每天一道面试题# 什么是MySQL的回表查询
  • #微信小程序:微信小程序常见的配置传旨
  • $.ajax,axios,fetch三种ajax请求的区别
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十)T检验-第一部分
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET命令行(CLI)常用命令
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • ;号自动换行
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • @vue/cli脚手架
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [C/C++] C/C++中数字与字符串之间的转换
  • [CISCN2019 华东南赛区]Web11
  • [IOI2018] werewolf 狼人
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表