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)[email protected] and [email protected]

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)[email protected] and [email protected]

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 [email protected]

------流量数据

select fmaddress,readtime,flux,PlusTotalFlux,ReverseTotalFlux

into #temp_flux

FROM tblfmreaddata WHERE [email protected]

AND readtime>@max_datetime

AND readtime>dateadd(day,-2,getdate())

-----压力数据

select fmaddress,readtime, isnull(pressure,0) press

into #temp_press

FROM tblfmreaddatapress WHERE [email protected]

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 [email protected]+‘_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 [email protected]+‘_YL‘

drop table #temp_flux

drop table #temp_press

-- 获取下一条数据

set @[email protected]+1

END

原文地址:https://www.cnblogs.com/Ting-light/p/9547288.html

时间: 2024-08-29 19:13:54

sql server 的游标的相关文章

一个Sql Server 的游标与循环嵌套的存储过程用例

一个Sql Server 的游标与循环嵌套的存储过程用例 准备代码 --创建表 CREATE TABLE everyoneAVG ( ID int primary key identity(1,1), AccNo INT, AVGTime INT, AddTimes INT ); DROP TABLE everyoneAVG; SELECT ID,AccNo AS '用户号',AVGTime/60 AS '平均充值时间间隔(小时)',AddTimes AS '总充值次数' FROM everyo

SQL Server之游标的基础知识

什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然很好用,但是如果滥用游标的话,会对程序的性能造成很大影响,使用的时候一定要谨慎啊! 游标的种类: MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标. (1) Transact_SQL 游标 Transact_SQL 游标是由declare

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

一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合. 游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录. 二:游标的基本形式 声明游标:形式1DECLARE cursor_name [INSENSITIVE] [SCROLL] CURS

SQL Server 初识游标

---恢复内容开始--- 游标:游标是一种能从包含多个数据的结果集每次提取一条的机制 游标的特点是: 检索得到的数据集更加灵活 可有针对性的对数据进行操作 拥有对数据进行删除和更新的能力 为何使用游标: 游标提供了一种比较好的解决方案,可以将批操作变成行操作. 游标的步骤  定义游标  打开游标  使用游标  关闭游标  删除游标 代码详解: 1. 定义游标 DECLARE 游标名 [ INSENSITIVE ] [ SCROLL ] CURSOR FOR T-SQL 语句 2. 打开游标 OP

Sql Server 之游标

一般来说,我们通过SQL一般是面向集合进行数据操作,但是游标提供给我们更加强大的功能可以对数据集合进行逐行遍历有选择性的操作处理.当然游标也有其不可避免的缺陷就是:低效和复杂.所以一般正常的操作处理不会选择使用游标进行数据操作. 游标的使用: declare testCur cursor for select ID,gradefrom student where grade <60 or grade is null   ---声明游标 open testCur                  

SQL Server 数据库游标选项

背景: 游标控制服务器端游标的行为,相关的T-SQL如下: declare , open , fetch , close , deallocate. 1. cursor_close_on_commit{on | off}; 如果设置为on 在事务提交时或回滚时会关闭打开的游标, 如果设置为off 游标会在提交事务后继续打开,除非游标定义为static 否则回滚事务会关闭任何游标. alter database studio   set cursor_close_on_commit on;  #

SQL Server之游标

部分参考自:https://www.cnblogs.com/knowledgesea/p/3699851.html 一.什么是游标 游标是取用一组数据并能够一次与一个单独的记录进行交互的方法,可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据.有时,确实不能通过在整个行集中修改或者甚至选取数据来获得所需要的结果,故需要逐一进行处理. 主要用处(存储过程): 定位到结果集中的某一行. 对当前位置的数据进行读写. 可以对结果集中的数据单独操作,而不是整行执行相

Sql Server利用游标批量清空数据表

先吐槽一下,由于公司要为新客户部署一个全新的系统,然而公司并没有空库,所以只能把正在线上运行的数据库给备份,然后清空相关数据 下面分享一下我在做清空数据库时写的一个批量清空数据表的方法 思路:查询出该库下的所有表 根据表名(系统相关数据表取名都是有规律的)筛选出需要清空的表 下面,上代码 1 USE [DataBase] 2 GO 3 DECLARE @name varchar(50) 4 DECLARE @count int 5 set @count=0 6 DECLARE contact_c

SQL Server 通过游标重新定义单据数据的单据编号

DECLARE @Index INTSET @Index=100DECLARE UpdateCursor  CURSOR  FOR (SELECT DISTINCT AA.Id FROM dbo.表 AA  WHERE  数据过滤条件 )OPEN UpdateCursorDECLARE @DetailId NVARCHAR(36)DECLARE @Name NVARCHAR(36)FETCH NEXT FROM UpdateCursor INTO @DetailIdWHILE @@FETCH_S