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日均线,resn日均线的值*/

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