-- 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. POJ 1270 Following Orders(拓扑排序)题解

    Description Order is an important concept in mathematics and in computer science. For example, Zorn' ...

  2. 大数字运算, BigInteger

    package com.ykmimi.test1; import java.math.BigInteger; /** * 大数字运算 * @author ukyor * */ public class ...

  3. 【TCP/IP详解 卷一:协议】第十八章 TCP连接 的建立与终止 (2)其余内容

    18.5 TCP的半关闭 牢记 TCP 是 全双工 的. 半关闭:TCP提供了连接的一端 在结束了它的发送后 还能接收来自另外一端数据的能力.但是只有很少的应用程序利用它. 为了实现这个特性,编程接口 ...

  4. HDU 2222 Keywords Search(AC自动机模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出多个单词,最后再给出一个模式串,求在该模式串中包含了多少个单词. 思路: AC自动机的模板题. ...

  5. MVC ---- IEnumerable<T>、List<T> 前台遍历展示

    突然做前台数据展示,发现IEnumerable 对一个列表的展示还是可以,但要是多个类型放在一个表中如何处理呢,如下: 一个类IEnumerable遍历 后台 public IEnumerable&l ...

  6. 词云wordcloud类介绍&python制作词云图&词云图乱码问题等小坑

    词云图,大家一定见过,大数据时代大家经常见,我们今天就来用python的第三方库wordcloud,来制作一个大数据词云图,同时会降到这个过程中遇到的各种坑, 举个例子,下面是我从自己的微信上抓的微信 ...

  7. 【Python】【元编程】【从协议到抽象基类】

    """class Vector2d: typecode = 'd' def __init__(self,x,y): self.__x = float(x) self.__ ...

  8. ubuntu 16.04 kinetic 安装rosbridge

    sudo apt-get install ros-kinetic-rosbridge-server

  9. Selenium 对窗口对HTML的操作举例

  10. dns未设置 PHP Warning: file_get_contents():php_network_getaddresses: getaddrinfo failed:

    php通过去访问外部网站时,出现以下提示: PHP Warning: file_get_contents(): php_network_getaddresses: getaddrinfo failed ...