-- 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. 我在linux中使用的vundle 和 vimrc配置

    set nocompatible filetype off set rtp+=~/.vim/bundle/vundle/ call vundle#rc() Plugin 'gmarik/vundle' ...

  2. Unity3D学习笔记(一):Unity3D简介

    Unity3D简介一.什么是Unity.U3D?全面整合的专业引擎 二.这个软件能做什么?1.内容:3D2D游戏,教育,建筑,网页,VRAR,家庭娱乐系统2.媒体:PC平台,主机,移动,VR 1.UE ...

  3. 发现 一个 http 压测库

    代码库:https://github.com/wg/wrk 安装 https://github.com/wg/wrk

  4. Python中浮点数精度处理

    Python中,浮点数运算,经常会碰到如下情况: 出现上面的情况,主要还是因浮点数在计算机中实际是以二进制保存的,有些数不精确.比如说: 0.1是十进制,转化为二进制后它是个无限循环的数:0.0001 ...

  5. md5 32位 加密原理 Java实现md5加密

    md5 32位 加密原理 简单概括起来,MD5 算法的过程分为四步:处理原文,设置初始值,循环加工,拼接结果. 第一步:处理原文 首先,我们计算出原文长度(bit)对 512 求余的结果,如果不等于 ...

  6. bootstrap3显示5列的方法

    bootstrap是个12栅格的系统,显示5列比较麻烦,今天用到到网上找了找方法,尝试成功,记录一下,以后好用. 需要自己再添加几个 css class样式: <style> .col-l ...

  7. 《剑指offer》第十二题(矩阵中的路径)

    // 面试题:矩阵中的路径 // 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有 // 字符的路径.路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右. // 上.下移动 ...

  8. Codeforces A - Bear and Prime 100(交互题)

    A - Bear and Prime 100 思路:任何一个合数都可以写成2个以上质数的乘积.在2-100中,除了4,9,25,49外都可以写成两个以上不同质数的乘积. 所以打一个质数加这四个数的表: ...

  9. 关于怎么解决java.lang.NoClassDefFoundError错误

    五一在部署新的统一登录时,遇到这样一个问题: 很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException这两个错误搞混,事实 ...

  10. windows批处理命令

    前言 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务.用户只需双击批处理文件便可执行任务,而无需重复输入相同指令.编写批处理文件非常简单,但难点在于确保一切按顺序 ...