sql server 的游标
-- sql server 中的游标
--声明游标
/*
declare cursorname [insensitive] [scroll] cursor
for <select-查询块>
[for {read only|update[of<列名>[,...,n]]}]
Insensitive 表示把取出来的数据存入一个在tempdb库中创建的临时表,任何通过这个游标进行的操作,都会在这个临时表里进行。所有对基本表的改动都不会在用游标进行的操作中体现出来,不用该关键字,则用户对基本表所进行的任何操作都将在游标中得到体现。
Scroll: 指定所有的提取选项(first,last,prior,wext,relative,absolute)均可用,允许删除和更新(假定没有使用insensitive选项)
for read only :游标只读。不允许通过只读游标进行数据的更新。
for update[of <列名>[,...,n]]:游标是可修改的。定义在这个游标里可以更新的列。如果定义了[of<列名>[,...n]],则只有其中的列可以被修改;否则,游标里的所有列都可以被修改。
*/
declare @tagname nvarchar(max)
declare @max_datetime datetime
declare mycursor cursor
for
select a.tagname,max(isnull(b.DateTime,0))
from tblfminfolive a
left join live_dblink.gb_scada_live.dbo.LiveData b on a.tagname=b.tagname and b.provider='TAX'
group by a.tagname;
-- 打开游标
open mycursor;
-- 提取数据
-- fetch[[next|prior|first|last|absoute n|relative n] from] <游标名> [into @变量名[,...,n]]
fetch next from mycursor into @tagname,@max_datetime;
/*全局变量@@fetch_status表示fetch语句的状态
0 表示提取正常
1 表示已经取到了数据集的末尾
其他值均表明操作出了问题
*/
-- 进入循环
while (@@fetch_status=0)
BEGIN
IF right(@tagname,2) !='YL'
-- 写入flux,PlusTotalFlux,ReverseTotalFlux to 目标表
insert into live_dblink.gb_scada_live.dbo.LiveData(
provider,sitename,tagname,MeterName,DateTime,value)
select 'TAX',b.username,b.tagname,b.MeterName,a.readtime
,case right(@tagname,2)
when 'SL' then a.flux
when 'ZL' then a.plustotalflux
when 'FL' then a.reversetotalflux
end
FROM tblfmreaddata a ,tblfminfolive b
WHERE a.fmaddress+right(@tagname,3)=@tagname and b.tagname=@tagname
AND a.readtime>@max_datetime
ELSE
--写入 pressure to 目标表
insert into live_dblink.gb_scada_live.dbo.LiveData(
provider,sitename,tagname,MeterName,DateTime,value)
select 'TAX',b.username,b.tagname,b.MeterName,a.readtime,isnull(a.pressure,0)
FROM tblfmreaddatapress a,tblfminfolive b
WHERE a.fmaddress+right(@tagname,3)=@tagname and b.tagname=@tagname
AND a.readtime>@max_datetime
-- 获取下一条数据
fetch next from mycusor into @tagname,@max_datetime;
END;
-- 关闭游标
close mycursor;
-- 释放游标
deallocate mycursor;
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- 由于sql server 的未知原因,cursor未能成功执行,于是创建临时表,原理类似cursor,如下:
--------------------------------------------------------------------------------
declare @cun int
declare @maxcun int
declare @max_datetime datetime
declare @fmaddress varchar(40)
create table #tmp_fmaddress
(
pid int identity(1,1),
fmaddress varchar(100),
max_datetime datetime
)
insert into #tmp_fmaddress(fmaddress,max_datetime)
select a.fmaddress,max(isnull(b.DateTime,0))
from tblfminfolive a
left join live_dblink.gb_scada_live.dbo.LiveData b on a.tagname=b.tagname and b.provider='TAX'
and b.DateTime>dateadd(day,-2,getdate())
group by a.fmaddress
set @cun=1
select @maxcun=max(pid) from #tmp_fmaddress
-- 进入循环
while @cun<@maxcun+1
BEGIN
select @fmaddress=fmaddress,@max_datetime=max_datetime from #tmp_fmaddress where pid=@cun
------流量数据
select fmaddress,readtime,flux,PlusTotalFlux,ReverseTotalFlux
into #temp_flux
FROM tblfmreaddata WHERE fmaddress=@fmaddress
AND readtime>@max_datetime
AND readtime>dateadd(day,-2,getdate())
-----压力数据
select fmaddress,readtime, isnull(pressure,0) press
into #temp_press
FROM tblfmreaddatapress WHERE fmaddress=@fmaddress
AND readtime>@max_datetime
and readtime>dateadd(day,-2,getdate())
-- 写入flux,PlusTotalFlux,ReverseTotalFlux to 目标表
insert into live_dblink.gb_scada_live.dbo.LiveData(
provider,sitename,tagname,MeterName,DateTime,value)
select 'TAX',b.username,b.tagname,b.MeterName,a.readtime
,case right(b.tagname,2)
when 'SL' then a.flux
when 'ZL' then a.plustotalflux
when 'FL' then a.reversetotalflux
end
FROM #temp_flux a,tblfminfolive b
where a.fmaddress=b.fmaddress and b.tagname!=@fmaddress+'_YL'
-- 写入 pressure
insert into live_dblink.gb_scada_live.dbo.LiveData(
provider,sitename,tagname,MeterName,DateTime,value)
select 'TAX',b.username,b.tagname,b.MeterName,a.readtime,a.press
FROM #temp_press a,tblfminfolive b
where a.fmaddress=b.fmaddress and b.tagname=@fmaddress+'_YL'
drop table #temp_flux
drop table #temp_press
-- 获取下一条数据
set @cun=@cun+1
END
sql server 的游标的更多相关文章
- SQL Server之游标的基础知识
什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然 ...
- SQL SERVER CURSOR游标的使用(转载)
一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...
- SQL SERVER触发器游标小记
今天接到个需求用触发器来实现通过条件对其他表的更新.好久没摸SQL SERVER,电脑里也没SQL SERVER安装包,同事遂发来个安装包,一看吓一跳,3.6G!!!!经过漫长等待后,开始作业.需求如 ...
- SQL Server 利用游标解决Tempdb究极竞争-DBA-程序员需知
SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点 ...
- sql server中游标
参考:http://blog.csdn.net/luminji/article/details/5130004 利用SQL Server游标修改数据库中的数据 SQL Server中的UPDATE语句 ...
- SQL Server 2008 游标使用实例
本文使用以下两张数据库表作为演示对象. 1 游标初探--使用游标进行遍历 declare @classAndStudent table( class_id int, --班级ID class_name ...
- SQL Server 初识游标
---恢复内容开始--- 游标:游标是一种能从包含多个数据的结果集每次提取一条的机制 游标的特点是: 检索得到的数据集更加灵活 可有针对性的对数据进行操作 拥有对数据进行删除和更新的能力 为何使用游标 ...
- Sql Server - CURSOR (游标)
1.声明游标 DECLARE 游标名 CURSOR SELECT语句(注:此处一定是SELECT语句) 2.打开游标 OPEN 游标名 3.读取 ...
- sql server 存储过程---游标的循环
sqlserver中的循环遍历(普通循环和游标循环) sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student
随机推荐
- openwrt的编译系统是如何生成squashfs文件系统的
答:请看include/image.mk中的以下定义: define Image/mkfs/squashfs $(STAGING_DIR_HOST)/bin/mksquashfs4 $(call mk ...
- 如何将一个Winform嵌入到一个Control当中
/// <summary> /// 将一个winform窗体嵌入control中 /// </summary> /// <param name="f" ...
- npm教程_脚手架原理以及bootstrap引入
格式:vue init <templateName> <ProjectName> 例子:vue init webpack vue02 运行上面的命令后,脚手架帮忙按照webpa ...
- Ambari安装指南
一.准备工作 l 基本工具 1) 安装epel,epel是一个提供高质量软件包的项目.先检查主机上是否安装: rpm -q epel-release 2) 如果没有安装,使用rpm命令安装: rpm ...
- C# SQLite数据库操作
WinCE项目开发 VS2008 自己写的SQLite数据库管理类代码如下: SQLiteManager.cs using System.Data; using System.Data.SQLit ...
- 基于贝叶斯优化的超参数tuning
https://arimo.com/data-science/2016/bayesian-optimization-hyperparameter-tuning/ 贝叶斯优化:使用高斯过程作为代理函数, ...
- python flask demo
from flask import Flask, jsonify from flask import abort from flask import make_response from flask ...
- dos与unix系统的格式转化
unix 只用\n作为行结束符,而在 dos中是以\r和\n作为行结束符, 如果一个文件是在unix系统下创建,然后想在dos下使用,就要用unix2dos,如 unix2dos file 如果一个文 ...
- 【转】总结C++中取成员函数地址的几种方法
转自:“http://www.cnblogs.com/nbsofer/p/get_member_function_address_cpp.html” 这里, 我整理了4种C++中取成员函数地址的方法, ...
- YOLO V1论文理解
摘要 作者提出了一种新的物体检测方法YOLO.YOLO之前的物体检测方法主要是通过region proposal产生大量的可能包含待检测物体的 potential bounding box,再用分类器 ...