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
随机推荐
- sql:临时表和表变量
在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集,表变量和临时表是两种选择. 临时表: 临时对象都以#或##为前缀,临时表是 ...
- shiro的简单入门使用
这里只是测试登录认证,没有web模块,没有连接数据库,用户密码放在shiro.ini配置中,密码没有加密处理,简单入门. 基于maven 先看目录结构 测试结果 pom.xml <?xml ve ...
- Jmeter 4.0 扩展插件
今天发现Jmeter4.0 也可以安装插件 而且比之前的版本的安装方法更为容易 https://jmeter-plugins.org/ https://jmeter-plugins.org/insta ...
- vs2010_相关目录
1. C:\Program Files\Microsoft SDKs\Windows\v7.0A 2.创建了 C:\Program Files\Microsoft Visual Studio 9.0 ...
- list_01
双向链表 不支持随机存取([?] / at(?)) A.头尾 添加/移除 A.1.list::push_back(elemValue); A.2.list::pop_back(); A.3.list: ...
- angular5 ng-content使用方法
先自定义一个组件import { Component } from '@angular/core'; @Component({ selector: 'exe-greet', template: ` & ...
- Java成员变量和局部变量
Java成员变量和局部变量 一.成员变量和局部变量 二.static关键字 三.成员变量和静态变量区别 四.main函数 五.静态函数什么时候用 六.静态代码块 七.构造代码块 构造代码块先于构造函数 ...
- Isotig & cDNA & gene structure & alternative splicing & gene loci & 表达谱
参考:高通量测序相关名词 Isotig 指在转录组de novo测序时,用454平台测序完成后组装出的结果,一个isotig可视为一个转录本. Isogroup 指转录组de novo测序中,用454 ...
- WPF中为窗体设置背景图片
在WPF应用程式中,我们往往想为一个窗体设置一个中意的背景图,而不是单独的为这个Background设置成某种颜色或渐变颜色的背景. 在WPF 利用Expression Blend工具如何达到这种效果 ...
- English trip M1 - PC12 I'd Like a Room Please Teacher:Taalan
In this lesson you will learn to say what you need. 在本课中,您将学习如何说出您的需求. Words list elevator 电梯 ...