字体:  

MSSQL中游标的使用

chinanic 发表于: 2008-8-07 17:04 来源: 海岸线网络聚合

马上奥运开幕了,做为地方门户,咳,总得有个奥运会报道吧,于是,折腾了一天,弄了个奥运会进程与奖牌排行,下面这个存储过程实现了奖牌榜的生成。

重点:
1、表变量的声明与使用,表变量不支持索引。
2、游标的使用,在存储过程中使用游标的 FEACH NEXT 对多行数据进行处理,游标使用完毕必须销毁。

CODE:

CREATE PROCEDURE Olympic_Medal_Count

AS
--变量定义
DECLARE @Country varchar(50)
DECLARE @GoldenMedalNum int
DECLARE @SilverMedalNum int
DECLARE @CopperMedalNum int
DECLARE @i int
SET @i=0
--表变量
DECLARE @tmpTable table(
        ID smallint IDENTITY(1,1),
        Country varchar(50),
        Gold int,
        Silver int,
        Copper int,
        OrderNum int

)

--游标引用
DECLARE medal_cursor CURSOR FOR
SELECT COUNT(*) AS MedalNum, Country
        FROM Olympic_Medals
        WHERE (Medal = 1)
        GROUP BY Country
        ORDER BY MedalNum DESC
OPEN medal_cursor
--提取第一名
FETCH NEXT FROM medal_cursor
INTO @GoldenMedalNum,@Country

WHILE @@FETCH_STATUS = 0
        BEGIN
                SET @i=@i+1
                --取该国家银牌
                SELECT @SilverMedalNum=COUNT(*) From Olympic_Medals where Medal=2 and Country=@Country
                --取该国家铜牌
                SELECT @CopperMedalNum=COUNT(*) From Olympic_Medals where Medal=3 and Country=@Country
                --将数据插入表变量
                Insert Into @tmpTable Values(@Country,@GoldenMedalNum,@SilverMedalNum,@CopperMedalNum,@i)
                FETCH NEXT FROM medal_cursor
                INTO @GoldenMedalNum,@Country

        END

SELECT * From @tmpTable
--关闭游标
CLOSE medal_cursor
--删除游标引用
DEALLOCATE medal_cursor
GO
[ 本帖最后由 chinanic 于 2008-8-7 17:17 编辑 ]