在sqlserver中使用游标update数据记录

  • Post author:
  • Post category:其他



根据测试需要,需改变表

ST_RIVER_R中

某时间段内数据的字段Z值,并且要求相邻两条数据Z值前后相差正负0.01。


想到了两种方法:


1、最简单的方法,就是直接通过客户端编辑数据库记录


2、使用update命令编辑字段值


第一种方式很简单,就是人为修改,但是由于此表的数据量比较大,客户端的局限性很难找到区间内的数据,所以放弃此方法。


第二种方式,


本来用update修改表数据是很简单的一件事情,但是重要的是现在要求前后相邻两条数据Z值有关系,所以简单的update语句无法实现该需求,于是想了下貌似只能用数据库游标来处理了,经研究写了下面一段程序。


写完后经过简单测试脚本没问题,之后手抖的在测试库中执行了下,结果如期而生,搞定!



–预操作的库

USE XZ_GEODB

GO

— 定义变量

DECLARE @Z numeric(7, 3),

@old numeric(7, 3),

@STCD varchar(8),

@TM datetime

–定义游标对象

DECLARE contact_cursor CURSOR FOR


–查询复核要求的结果集

select  Z,STCD,TM from ST_RIVER_R where STCD=’hd000917′ and TM >=’2014-11-05′ and TM<=’2014-11-06′

FOR UPDATE


–开启游标进行处理

OPEN contact_cursor

–读取第一条记录

FETCH NEXT FROM contact_cursor

INTO @old,@STCD,@TM

WHILE @@FETCH_STATUS = 0

BEGIN

–PRINT @old


–更新游标所在行的数据

UPDATE ST_RIVER_R SET Z=@old where STCD=@STCD AND TM=@TM


–游标移到下一行

FETCH NEXT FROM contact_cursor INTO @Z,@STCD,@TM


–关键在这里: old值为前一行的值加/减0.01

SET @old=@old+(sign(0.5-RAND())*0.01)

END


–关闭游标

CLOSE contact_cursor

DEALLOCATE contact_cursor

GO


注:以上脚本中有两个点需要考虑,一个是游标的使用,另一个是如何解决正负0.01这个值的随机发生生成。



随机生成0.01:sign(0.5-RAND())*0.01



版权声明:本文为tengyeyijiu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。