SQL游标使用

USE  [ WPSIV2 ]
GO
/* ***** Object:  StoredProcedure [dbo].[Proc_GetHotProduceByShopID]    Script Date: 01/17/2012 10:17:09 ***** */
SET ANSI_NULLS  ON
GO
SET QUOTED_IDENTIFIER  ON
GO
--  =============================================
--
 Author     :  Isaac Zhang
--
 Create date:  2011-1-11
--
 Update date:
--
 Parameter  :  @shopid 商铺ID,
--
                 @topNum  前几位
--
 Description:     根据商铺ID获取热门商铺信息,
--
 =============================================
ALTER  PROCEDURE  [ dbo ]. [ Proc_GetHotProduceByShopID ]
     @shopid  BIGINT,
     @topNum   INT
AS
BEGIN
     -- 需要返回的结果集
     CREATE  TABLE #RESULT(
        pName  VARCHAR( 50), -- 商品名称
        saleNum  INT,       -- 销售数量(最小单位计量)
        unit  VARCHAR( 50),  -- 最小单位
        price  DECIMAL( 14, 2) -- 商品总销售额
    )
     -- 创建临时表,作为处理的中间表
     CREATE  TABLE # temp(
        pName  VARCHAR( 50), -- 商品名称
        saleNum  INT,       -- 销售数量
        unit  VARCHAR( 50),  -- 单位
        price  DECIMAL( 14, 2) -- 商品总销售额
    )
    
     -- 声明过程中需要使用的临时参数
     DECLARE  @sql  VARCHAR( 2000)
     DECLARE  @pName  VARCHAR( 50), @unit  VARCHAR( 50)
     DECLARE  @saleNum  INT
     DECLARE  @price  DECIMAL( 14, 2)
     SET  @sql  =  ' INSERT INTO #TEMP(pName,saleNum,unit,price) SELECT b.name,a.quantity,a.unit,a.cost FROM dbo.pt_sale a 
                LEFT JOIN dbo.pt_product b
                ON a.productid = b.productid
'
     EXEC ( @sql);
     -- 声明一个游标
     DECLARE produceCursor  CURSOR    
     FOR  SELECT  TOP  5 pName,saleNum  FROM # TEMP
     -- 打开一个游标    
     OPEN produceCursor
     -- 循环一个游标
     FETCH  NEXT  FROM  produceCursor  INTO  @pName, @saleNum
    
     WHILE  @@FETCH_STATUS  =  0
     BEGIN
         INSERT #RESULT
                ( pName,saleNum, unit, price )
         VALUES  (  @pName--  pName - varchar(50)
                   0--  saleNum - int
                   @saleNum,   --  unit - varchar(50)
                   NULL  --  price - decimal
                  )    
     FETCH  NEXT  FROM  produceCursor  INTO  @pName, @saleNum
     END    
                  
     -- 关闭游标
     CLOSE produceCursor
     -- 释放资源
     DEALLOCATE produceCursor

     --  SET NOCOUNT ON added to prevent extra result sets from
     --  interfering with SELECT statements.
     SET NOCOUNT  ON;
     BEGIN  TRANSACTION
    

         SELECT  *  FROM #RESULT;
     IF  @@ERROR = 0
     COMMIT
     ELSE
     ROLLBACK   
END

你可能感兴趣的:(sql)