ifCOL_LENGTH('book1','n日均线')isnotnull/*判断表中是否存在列名为n日
均线的列,存在就删除,不存在就创建,book表示数据表名*/
begin
altertable book1 /*修改表*/
dropcolumn n日均线/*删除列*/
end
altertable book1 /*修改表*/
add n日均线decimal(18,2)null/*增加列*/
GO
/*********************************************创建存储过程*****************************************************/
CREATE PROCEDURE nri /*存储过程名称为nri*/
@n int,@resfloatoutput/*输入参数n表示n日均线,res为n日均线的值*/
as
declare @low int/*定义循环变量low*/
declare @high int/*定义循环变量@high*/
declare @max int/*定义变量max表示book1表中数据的总量*/
declare @nsum float/*定义变量nsum表示某天n日收盘的总和*/
set @high=@n /*high初始为n*/
select @max=count(*)from book1 /*查询book数据表中数据的总行量*/
/*******************************创建游标************************************************/
declare test cursor SCROLL FOR/*定义游标名为test*/
select时间,收盘from book1 /*取得要查询的结果集,游标指向此结果集*/
open test /*打开游标*/
declare @收盘float/*定义局部变量收盘,数据类型要跟表中的列保持一致,接收book1表中“收盘”列的数据*/
declare @时间nvarchar(255)/*定义局部变量时间,数据类型要跟表中的列保持一致,接收book1表中“时间”列的数据*/
/****************************外循环开始*************************************************/
while @high<=@max /*所求某日的均线值该日是否不大于表中数据的总行量*/
begin
set @nsum=0 /*某天n日收盘的总和初始值为*/
set @low=@high-@n+1/*所求某天n日均线这n天中的第一日始终比最后一日少(n-1)日*/
/******************************内循环开始*****************************************************/
while @low<=@high/*low是否不大于high,low每次循环+1表示下一日,直到等于所求n日中最后一日*/
begin
fetch ABSOLUTE @low fromtest into @时间,@收盘/*游标根据low值定位对应第几行(第几日)数据,
并把数据赋值给局部变量@时间,@收盘*/
set @nsum=@nsum+@收盘/*n日的收盘值相加*/
set @res=@nsum/@n /*求得某日的n日均线*/
set @low=@low+1 /*low+1表示下一日*/
end
update book1 set n日均线=@res where时间=@时间/*更新日均线的值,把求得的日均线的值更新到对应日期*/
set @high=@high+1 /*求下一日的n日均线*/
end
CLOSE test /*关闭游标*/
DEALLOCATE test /*释放游标资源*/
/*新建查询*/
DECLARE @rijun float/*声明变量@rijun接收存储过程的输出参数*/
EXEC nri @n=6,@res=@rijun OUTPUT/*执行存储过程nri,输入参数n为(6日均线)*/
/*输出参数res传递给变量@rijun*/
/*新建查询删除存储过程*/
dropproc nri
转载于:https://blog.51cto.com/wxc578058098/1407720