游标的使用,相当方便,下面贴一个例子:

Code
1
set ANSI_NULLS ON
2
set QUOTED_IDENTIFIER ON
3
GO
4
ALTER PROCEDURE [dbo].[GetProductPriceFromYear]
5
@ProductID int,
6
@Date Datetime
7
AS
8
BEGIN
9
create table #temp1
10
(
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 int
24
)
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 desc
40
Open CurPrice
41
Fetch from CurPrice into @AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice
42
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
BEGIN
47
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 = @AddDate
52
Fetch from CurPrice into @AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice
53
end
54
Close CurPrice
55
Deallocate CurPrice
56
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 desc
62
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 #temp1
70
Open Cur
71
Fetch Cur Into @weekid
72
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 week
76
update #temp1 set WeekLPrice = @WeekLPrice,WeekHPrice=@WeekHPrice,WeekAPrice=@WeekAPrice,
77
WeekDayCount=(select count(*) from #temp1 where week = @weekid) where week = @weekid
78
Fetch Cur Into @weekid
79
end
80
Close Cur
81
Deallocate cur
82
select * from #temp1
83
END
来源:https://www.cnblogs.com/legolas_z/archive/2008/08/12/1266407.html