游标的使用,相当方便,下面贴一个例子:
1
set ANSI_NULLS ON2
set QUOTED_IDENTIFIER ON3
GO4
ALTER PROCEDURE [dbo].[GetProductPriceFromYear] 5
@ProductID int,6
@Date Datetime7
AS8
BEGIN9
create table #temp110
(11
id int IDENTITY(1,1) NOT NULL primary key,12
AddDate varchar(20),13
[datename] varchar(20),14
week varchar(20),15
ProductName varchar(20),16
ProductID varchar(20),17
LPrice float(20),18
HPrice float(20),19
APrice float(20),20
WeekLPrice float(20),21
WeekHPrice float(20),22
WeekAPrice float(20),23
WeekDayCount int24
)25

26
declare @tempDate varchar(20)27
declare @AddDate varchar(20)28
declare @datenam varchar(20)29
declare @week varchar(20)30
declare @ProductName varchar(20)31
declare @Product varchar(20)32
declare @LPrice varchar(20)33
declare @HPrice varchar(20)34
declare @APrice varchar(20)35
Declare CurPrice Cursor For 36
select distinct AddDate=CONVERT(char(10),a.AddDate,20),datename(dw,a.AddDate) as [datename],37
datepart(ww,a.AddDate) as week, b.ProductName,a.ProductID,a.LPrice,a.HPrice,a.APrice 38
from dbo.SmsPrice as a join dbo.SmsProduct as b 39
on a.ProductID = b.ProductId where a.ProductID = @ProductID AND Datediff(yy,a.AddDate,@Date)=0 order by AddDate desc40
Open CurPrice 41
Fetch from CurPrice into @AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice42
insert into #temp1(AddDate,[datename],week,ProductName,ProductID,LPrice,HPrice,APrice)43
values(@AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice)44

45
While @@FETCH_STATUS=0 46
BEGIN47
48
if(@tempDate!=@AddDate)49
insert into #temp1(AddDate,[datename],week,ProductName,ProductID,LPrice,HPrice,APrice)50
values(@AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice)51
set @tempDate = @AddDate52
Fetch from CurPrice into @AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice53
end54
Close CurPrice55
Deallocate CurPrice56

57
--insert into #temp1(AddDate,[datename],week,ProductName,ProductID,LPrice,HPrice,APrice) 58
--select distinct AddDate=CONVERT(char(10),a.AddDate,20),datename(dw,a.AddDate) as [datename],59
--datepart(ww,a.AddDate) as week, b.ProductName,a.ProductID,a.LPrice,a.HPrice,a.APrice 60
--from dbo.Price as a join dbo.SmsProduct as b 61
--on a.ProductID = b.ProductId where a.ProductID = @ProductID AND Datediff(yy,a.AddDate,@Date)=0 order by AddDate desc62
declare @weekid varchar(20)63
declare @tempWeek2 varchar(20)64
declare @WeekLPrice float(20)65
declare @WeekHPrice float(20)66
declare @WeekAPrice float(20)67

68
Declare Cur Cursor For 69
select distinct week from #temp170
Open Cur 71
Fetch Cur Into @weekid72
While @@FETCH_STATUS=0 73
BEGIN 74
select @tempWeek2=week,@WeekLPrice=avg(CONVERT(float,LPrice)),@WeekHPrice=avg(CONVERT(float,HPrice)),75
@WeekAPrice=avg(CONVERT(float,APrice)) from #temp1 where week =@weekid group by week76
update #temp1 set WeekLPrice = @WeekLPrice,WeekHPrice=@WeekHPrice,WeekAPrice=@WeekAPrice,77
WeekDayCount=(select count(*) from #temp1 where week = @weekid) where week = @weekid78
Fetch Cur Into @weekid 79
end80
Close Cur 81
Deallocate cur82
select * from #temp183
END
来源:https://www.cnblogs.com/legolas_z/archive/2008/08/12/1266407.html