有时候需要在SQL中对查询结果循环,下面是一个使用游标的示例:
1
set ANSI_NULLS ON2

3
set QUOTED_IDENTIFIER ON4

5
GO6

7
ALTER PROCEDURE [dbo].[GetProductPriceFromYear] 8

9
@ProductID int,10

11
@Date Datetime12

13
AS14

15
BEGIN16

17
create table #temp118

19
(20

21
id int IDENTITY(1,1) NOT NULL primary key,22

23
AddDate varchar(20),24

25
[datename] varchar(20),26

27
week varchar(20),28

29
ProductName varchar(20),30

31
ProductID varchar(20),32

33
LPrice float(20),34

35
HPrice float(20),36

37
APrice float(20),38

39
WeekLPrice float(20),40

41
WeekHPrice float(20),42

43
WeekAPrice float(20),44

45
WeekDayCount int46

47
)48

49
50

51
declare @tempDate varchar(20)52

53
declare @AddDate varchar(20)54

55
declare @datenam varchar(20)56

57
declare @week varchar(20)58

59
declare @ProductName varchar(20)60

61
declare @Product varchar(20)62

63
declare @LPrice varchar(20)64

65
declare @HPrice varchar(20)66

67
declare @APrice varchar(20)68

69
Declare CurPrice Cursor For 70

71
select distinct AddDate=CONVERT(char(10),a.AddDate,20),datename(dw,a.AddDate) as [datename],72

73
datepart(ww,a.AddDate) as week, b.ProductName,a.ProductID,a.LPrice,a.HPrice,a.APrice 74

75
from dbo.SmsPrice as a join dbo.SmsProduct as b 76

77
on a.ProductID = b.ProductId where a.ProductID = @ProductID AND Datediff(yy,a.AddDate,@Date)=0 order by AddDate desc78

79
Open CurPrice 80

81
Fetch from CurPrice into @AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice82

83
insert into #temp1(AddDate,[datename],week,ProductName,ProductID,LPrice,HPrice,APrice)84

85
values(@AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice)86

87
88

89
While @@FETCH_STATUS=0 90

91
BEGIN92

93
94

95
if(@tempDate!=@AddDate)96

97
insert into #temp1(AddDate,[datename],week,ProductName,ProductID,LPrice,HPrice,APrice)98

99
values(@AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice)100

101
set @tempDate = @AddDate102

103
Fetch from CurPrice into @AddDate,@datenam,@week,@ProductName,@Product,@LPrice,@HPrice,@APrice104

105
end106

107
Close CurPrice108

109
Deallocate CurPrice110

111
112

113
--insert into #temp1(AddDate,[datename],week,ProductName,ProductID,LPrice,HPrice,APrice) 114

115
--select distinct AddDate=CONVERT(char(10),a.AddDate,20),datename(dw,a.AddDate) as [datename],116

117
--datepart(ww,a.AddDate) as week, b.ProductName,a.ProductID,a.LPrice,a.HPrice,a.APrice 118

119
--from dbo.Price as a join dbo.SmsProduct as b 120

121
--on a.ProductID = b.ProductId where a.ProductID = @ProductID AND Datediff(yy,a.AddDate,@Date)=0 order by AddDate desc122

123
declare @weekid varchar(20)124

125
declare @tempWeek2 varchar(20)126

127
declare @WeekLPrice float(20)128

129
declare @WeekHPrice float(20)130

131
declare @WeekAPrice float(20)132

133
134

135
Declare Cur Cursor For 136

137
select distinct week from #temp1138

139
Open Cur 140

141
Fetch Cur Into @weekid142

143
While @@FETCH_STATUS=0 144

145
BEGIN 146

147
select @tempWeek2=week,@WeekLPrice=avg(CONVERT(float,LPrice)),@WeekHPrice=avg(CONVERT(float,HPrice)),148

149
@WeekAPrice=avg(CONVERT(float,APrice)) from #temp1 where week =@weekid group by week150

151
update #temp1 set WeekLPrice = @WeekLPrice,WeekHPrice=@WeekHPrice,WeekAPrice=@WeekAPrice,152

153
WeekDayCount=(select count(*) from #temp1 where week = @weekid) where week = @weekid154

155
Fetch Cur Into @weekid 156

157
end158

159
Close Cur 160

161
Deallocate cur162

163
select * from #temp1164

165
END166
来源:https://www.cnblogs.com/JasonChou/archive/2009/02/24/1397485.html