-- 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 的游标的更多相关文章

  1. SQL Server之游标的基础知识

    什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然 ...

  2. SQL SERVER CURSOR游标的使用(转载)

    一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...

  3. SQL SERVER触发器游标小记

    今天接到个需求用触发器来实现通过条件对其他表的更新.好久没摸SQL SERVER,电脑里也没SQL SERVER安装包,同事遂发来个安装包,一看吓一跳,3.6G!!!!经过漫长等待后,开始作业.需求如 ...

  4. SQL Server 利用游标解决Tempdb究极竞争-DBA-程序员需知

    SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点 ...

  5. sql server中游标

    参考:http://blog.csdn.net/luminji/article/details/5130004 利用SQL Server游标修改数据库中的数据 SQL Server中的UPDATE语句 ...

  6. SQL Server 2008 游标使用实例

    本文使用以下两张数据库表作为演示对象. 1 游标初探--使用游标进行遍历 declare @classAndStudent table( class_id int, --班级ID class_name ...

  7. SQL Server 初识游标

    ---恢复内容开始--- 游标:游标是一种能从包含多个数据的结果集每次提取一条的机制 游标的特点是: 检索得到的数据集更加灵活 可有针对性的对数据进行操作 拥有对数据进行删除和更新的能力 为何使用游标 ...

  8. Sql Server - CURSOR (游标)

    1.声明游标            DECLARE 游标名 CURSOR SELECT语句(注:此处一定是SELECT语句)        2.打开游标           OPEN 游标名 3.读取 ...

  9. sql server 存储过程---游标的循环

    sqlserver中的循环遍历(普通循环和游标循环) sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student

随机推荐

  1. 以太坊(Ethereum) - 节点时间未同步和区块同步失败案例分析

    背景 以太坊技术搭建的区块链网络,节点间需要保证时间一致,才能正常有序的发送交易和生成区块,使得众多节点共同维护分布式账本(区块数据+状态数据).但是,网络中节点的系统时间不一致回出现什么现象呢,我们 ...

  2. Autoafc 手动获取接口实例

    demo: using Autofac; using Autofac.Integration.Mvc; using Rongzi.RZR.Huoke.Repository; using Rongzi. ...

  3. TeeChart取消3D

    tChart1.Aspect.View3D = false;//此属性默认是true 3d的效果 2d平面的效果 题外话,在使用控件的时候,需要注意: 在TChart控件上增加Series,   se ...

  4. 【第二十六章】 hystrix-dashboard + turbine

    一.使用turbine的意义 引入多个hystrix stream: 1.使用hystrix-dashboard的可以添加多个stream的功能 图中添加的两个stream会在真正monitor的时候 ...

  5. 51nod 1003 阶乘后面0的数量

    每一个 2 与一个 5 相乘,结果就增加一个零. 所以求 n! 后面的连续零的个数,其实就是求其中相乘的数含有因子每对因子 2 与 5  的个数. 又因为从1到某个数,所含 2 的个数比 5 多,所以 ...

  6. 2:JavaScript中的基本运算

    今天说的是JavaScript中的数据基本运算 在上一节中已经说了关于JavaScript中的基本数据类型 那么数据有了 剩下来就是数据之间的运算 表达式-------预算符(赋值 比较 算数 逻辑 ...

  7. package 'orocos-bfl' not found CMake Error at /usr/share/cmake-2.8/Modules/FindPkgConfig.cmake:283 (message):

    #没有数字 sudo apt-get install ros-indigo-bfl

  8. 启动tomcat一闪而过问题调试并解决

    之前一直用myelise+tomcat启动项目很正常,今天在尝试用绿色版tomcat8时,点击startup.bat文件时,一闪而过,tomcat未正常启动,也无法看到错误信息.搜索网络查找到调试方法 ...

  9. Java 常用对象-String类

    2017-11-02 20:02:06 String:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能 ...

  10. 各个安卓版本 使用的 Linux Kernel Version

    Android Version |API Level |Linux Kernel in AOSP --------------------------------------------------- ...