之前写了一个存储过程

目标: 根据时间,获取指定范围的数据集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. nginx 反向代理 Nginx 502 Bad Gateway

    查看错误日志: 摘要: nginx反向代理出现502错误 通过查看日志发现错误信息 2018/01/10 17:58:20 [crit] 8156#0: *1 connect() to 127.0.0 ...

  2. [Full-stack] 异步即时通信 - Async

    故事背景 socket.io, node.js, koa为首的一些通信框架和后端技术点. 之后有必要过一遍<NodeJS 设计模式>. 基础概念 一.短轮询.长轮询(comet).长连接( ...

  3. ubuntu安装cocos2dx

    操作系统:ubuntu16.04 LTSIDE:Code::blocks 16.01Cocos2dx版本:cocos2d-x 3.11.1这篇随笔将会简要地演示如何在ubuntu下安装cocos2dx ...

  4. exec vs sp_executesql

    1.exec  vs  sp_executesql 1.1 说到exec了解SQLServer的朋友第一反应应该是它用来执行存储过程,对的这是其一,另一个作用是执行一个动态批处理.总结下:a.执行一个 ...

  5. day_5.07py

    正则:

  6. spark - Locality Level

    这几个值在图中代表 task 的计算节点和 task 的输入数据的节点位置关系 PROCESS_LOCAL: 数据在同一个 JVM 中,即同一个 executor 上.这是最佳数据 locality. ...

  7. triangular distribution

    mode(众数), 一组数据中出现次数最多的那个(或那些)数值. 众数可以不存在或多于一个. 例如, 1,2,3,3,4的众数是3. 1,2,2,3,3,4的众数是2和3. 1,2,3,4,5没有众数 ...

  8. Unix api

    ● 线程 进程的所有信息都被自己的线程共享,包括代码.全局内存.堆.栈.文件描述符. 线程拥有自己的信息,包括线程ID.一组寄存器值.栈.调度优先级和策略.信号屏蔽字.errno变量以及线程的私有数据 ...

  9. 一、SQL定义变量

    http://blog.csdn.net/changwei07080/article/details/7561602 在SQL我们使用declare定义局部变量,同时可以使用set和select 对变 ...

  10. python web篇 创建数据库

    python3 manage.py migrate ls sqlite3 使用单文件数据库,管理方便 运行测试 python manage.py runserver 输入http://127.0.0. ...