sql server 的游标

本文介绍了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

转载于:https://www.cnblogs.com/Ting-light/p/9547288.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值