之前写了一个存储过程

目标: 根据时间,获取指定范围的数据集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

20180925 SQL Server游标使用的更多相关文章

  1. SQL Server 游标运用:鼠标轨迹字符串分割

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 游标模板(Cursor Template) 鼠标轨迹字符串分割SQL脚本实现(SQL Code ...

  2. sql server 游标的简单用法

    sql server游标: --定义游标 declare cursor1 cursor for select ID,Name from A --打开游标 open cursor1 declare @i ...

  3. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  4. SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database)

    原文:SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database) 一.本文所涉及的内容(Contents) 本文所涉及的内容 ...

  5. SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database)

    原文:SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database) 一.本文所涉及的内容(Contents) 本文所涉及的内容(C ...

  6. SQL Server游标(转)

    清晰地介绍了SQL游标,很好的学习资料. 转自 http://www.cnblogs.com/knowledgesea/p/3699851.html 什么是游标 结果集,结果集就是select查询之后 ...

  7. SQL Server游标

    什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据 ...

  8. SQL Server游标【转】

      什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作 ...

  9. SQL Server 游标

    结果集,结果集就是select查询之后返回的所有行数据的集合. 在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行. 正常面向集合的思维方式是: 而 ...

随机推荐

  1. duilib进阶教程 -- Container控件 (3)

    前面两个教程的目的是教大家与MFC结合,那么从这篇起,将不再使用MFC,而使用纯win32项目,本文的所有知识已经在<duilib入门教程>里面讲过了,因此基础知识不再赘述. 代码下载:h ...

  2. 十二、K3 WISE 开发插件《工业单据老单与自己添加的窗体 - 互相传值传参》

    ===================================== 目录: 1.演示效果--[销售订单]传值给[自定义窗体] 2.演示效果--[自定义窗体]传值给[销售订单] 3.附源码 4. ...

  3. [原]NTP时间服务器简单设置

    ====server edit   /etc/ntp.conf 添加 server 127.127.1.0 fudge 127.127.1.0 stratum 1 fudge 127.127.1.0 ...

  4. Ingeter与int的比较

    ,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false? 首 ...

  5. Jenkins解决无法获取插件的办法(升级站点目录)

    Jenkins解决无法获取插件的办法 可能是由于Jenkins的更新网站被QIANG,因此,请替换插件的服务器地址: http://mirror.xmission.com/jenkins/update ...

  6. 网络通信协议八之(传输层)TCP协议详解

    传输层协议 分段是为了提高传输效率,封装是指给每个数据段添加一个编号 端到端的传输是逻辑上的端到端,并不是真正意义上的发送方某层与接收方某层之间的传输 IP协议只是保证数据报文发送到目的地,为主机之间 ...

  7. window.history.go(-1)返回且刷新页面 点击返回上一层

    windows窗口对象(历史)history.go(),history.back(),history.forward(). 因为windows对象引用不是必须的.所以windows.history.g ...

  8. ubuntu下hadoop0.20.2报错/dfs/name is in an inconsistent state

    Hadoop0.20.2在关机重启后,namenode启动报错: 用bin/hadoop namenode -format重新格式化一下就好了.这个问题已经出现了两次.每次都格式化,显然不是一个专业的 ...

  9. Codeforces 670E - Correct Bracket Sequence Editor - [链表]

    题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...

  10. 相对定位和绝对定位 left和margin-left

    1.直接在css中设置left生效的前提是必须设置父容器position:absolute或relative,如果不设置则会以最近一个定位的父对象为参考点,.margin-left则不用设positi ...