存储过程,游标

USE [XinZhi]
GO
/****** Object:  StoredProcedure [dbo].[商品促销策略]    Script Date: 2018/10/25 17:06:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER proc  [dbo].[商品促销策略] (
@store_id NVARCHAR(50), --门店/商户编号
@client_type NVARCHAR(50),--终端类型
@product_id NVARCHAR(50),--商品编号
@sku_id NVARCHAR(50))--SKU编号
as
BEGIN
           declare @server_id nvarchar(50)--服务id
           declare @qty int--查询是否存在
           declare @pr_sn varchar(50)--促销活动单号
           declare @pr_type varchar(50)--促销类型
           declare @pr_type_value varchar(50)--促销类型值
           declare @status int-- 状态
           DECLARE @display_ids nvarchar(50);--陈列分类编号
           DECLARE @display_id nvarchar(50);--陈列分类编号
           select @server_id=server_id from tb_pos_client where store_id=@store_id and client_type=@client_type--获取终端销售服务编号
           SET @status=0;
          IF(@status=0)  --第一步查看商品是否存在活动
            BEGIN
           SELECT @qty=COUNT(1),@pr_sn=MAX(pr.pr_sn) FROM tb_promot_product pr
                        JOIN tb_promot p ON pr.pr_sn=p.pr_sn
                        JOIN tb_promot_client clinet ON p.pr_sn=clinet.pr_sn
                        WHERE p.end_date>=GETDATE() AND p.pr_state=0 AND ISNULL(pr.product_id,'')<>''
                        AND product_id=@product_id AND clinet.client_type=@client_type
                        AND p.pr_type<>'MP' AND p.[is_member]=0 AND (p.store_id=@store_id  OR p.store_id='-')
           print('---单品打折--'+cast(@qty as varchar(50))+'优惠编号:'+@pr_sn+'商品编号'+@product_id);
           IF(@qty>0)
                BEGIN
                print @server_id
                   EXEC 促销商品销售价计算 @pr_sn,@product_id,@server_id        
                   SET @status=1               
                END
           END
          IF(@status=0) --第二步查看出版社是否存在活动
                BEGIN
                SELECT @qty=COUNT(1),@pr_sn=MAX(pr.pr_sn) FROM tb_pdt_price p
                 JOIN book_product_attr a ON p.product_id=a.product_id
                 JOIN tb_pos_client c ON p.server_id=c.server_id
                 JOIN tb_promot_product pr ON a.publisher_id=pr.publisher_code
                 JOIN tb_promot pm ON pr.pr_sn=pm.pr_sn AND pm.end_date>=GETDATE() AND pm.pr_state=0 AND ISNULL(pr.publisher_code,'')<>''
                 JOIN tb_promot_client clinet ON pm.pr_sn=clinet.pr_sn
                WHERE p.product_id=@product_id AND (pm.store_id=@store_id  OR pm.store_id='-') AND clinet.client_type=@client_type AND c.client_type=@client_type AND pm.pr_type<>'MP' AND pm.[is_member]=0
                print('---出版社打折--'+cast(@qty as varchar(50)));
                 IF(@qty>0)
                   BEGIN
                     EXEC 促销商品销售价计算 @pr_sn,@product_id,@server_id        
                     SET @status=1
                    END
                END       
          IF(@status=0)--第三级分类
            BEGIN
                SELECT @qty=COUNT(1),@pr_sn=MAX(pr.pr_sn) FROM tb_pdt_price p
                 JOIN book_product_attr a ON p.product_id=a.product_id
                 JOIN tb_pos_client c ON p.server_id=c.server_id
                 JOIN tb_promot_product pr ON a.display_id=pr.display_id
                 JOIN tb_promot pm ON pr.pr_sn=pm.pr_sn AND pm.end_date>=GETDATE() AND pm.pr_state=0 AND ISNULL(pr.display_id,'')<>'' AND LEN(pr.display_id)=8
                 LEFT JOIN tb_promot_client clinet ON pm.pr_sn=clinet.pr_sn
                WHERE p.product_id=@product_id AND (pm.store_id=@store_id  OR pm.store_id='-') AND c.client_type=@client_type AND clinet.client_type=@client_type  AND pm.pr_type<>'MP' AND pm.[is_member]=0
                print('---第三级分类打折--'+cast(@qty as varchar(50)));
                 IF(@qty>0)
                   BEGIN
                     EXEC 促销商品销售价计算 @pr_sn,@product_id,@server_id        
                     SET @status=1    
                   END
            END
          IF(@status=0)--第二级分类
            BEGIN
                 create table #price_display(display_id varchar(50))
                 --1.定义游标
                 DECLARE price_adjust  CURSOR SCROLL
                 FOR  SELECT display_id FROM tb_promot_product pr
                 JOIN tb_promot pm ON pr.pr_sn=pm.pr_sn AND pm.end_date>=GETDATE() AND pm.pr_state=0 AND ISNULL(pr.display_id,'')<>'' AND LEN(pr.display_id)=5
                 JOIN tb_promot_client clinet ON pm.pr_sn=clinet.pr_sn
                 WHERE pm.pr_type<>'MP' AND clinet.client_type=@client_type  
                 AND (pm.store_id=@store_id  OR pm.store_id='-')    AND pm.[is_member]=0
                --2.打开游标
                OPEN price_adjust
                --4.定位游标到哪一行
                FETCH FIRST FROM price_adjust INTO @display_id --into的变量数量必须与游标查询结果集的列数相同
                 WHILE @@fetch_status=0  --提取成功,进行下一条数据的提取操作
                 BEGIN
                 --写入临时表分类的ID
                 INSERT INTO #price_display SELECT display_id FROM book_class_display where  CHARINDEX(','+replace(@display_id,' ','')+',',','+family_ids) >0    
                 FETCH NEXT  FROM price_adjust INTO @display_id  --移动游标
                 END
                  --关闭游标
                CLOSE price_adjust
                --释放游标
                DEALLOCATE price_adjust    
                      SELECT @qty=COUNT(1),@display_ids=MAX(play.display_id) FROM tb_pdt_price p
                     JOIN book_product_attr a ON p.product_id=a.product_id
                     JOIN tb_pos_client c ON p.server_id=c.server_id
                     JOIN #price_display play ON a.display_id=play.display_id
                    WHERE p.product_id=@product_id AND c.store_id=@store_id AND client_type=@client_type             
                    print('---第二级分类打折--'+cast(@qty as varchar(50)));        
                 IF(@qty>0)
                   BEGIN
                      SELECT  @pr_sn=pr_sn FROM tb_promot WHERE pr_sn IN(
                      SELECT MAX(pr.pr_sn) FROM tb_promot_product pr
                      JOIN tb_promot pm ON pr.pr_sn=pm.pr_sn AND pm.end_date>=GETDATE() AND pm.pr_state=0 AND ISNULL(pr.display_id,'')<>'' AND
                     pr.display_id= LEFT(@display_ids,5))
                     EXEC 促销商品销售价计算 @pr_sn,@product_id,@server_id
                     DROP TABLE  #price_display
                     SET @status=1    

                   END
            END
          IF(@status=0)--第一级分类
            BEGIN
                 create table #price_display1(display_id varchar(50))
                 --1.定义游标
                 DECLARE price_adjust  CURSOR SCROLL
                 FOR  SELECT display_id FROM tb_promot_product pr
                 JOIN tb_promot pm ON pr.pr_sn=pm.pr_sn AND pm.end_date>=GETDATE() AND pm.pr_state=0 AND ISNULL(pr.display_id,'')<>''  AND ( LEN(pr.display_id)=2 OR pr.display_id='ROOT' )
                 JOIN tb_promot_client clinet ON pm.pr_sn=clinet.pr_sn
                 JOIN tb_pos_client c ON pm.server_id=c.server_id
                 WHERE pm.pr_type<>'MP' AND clinet.client_type=@client_type  AND c.client_type=@client_type
                 AND (pm.store_id=@store_id  OR pm.store_id='-')    AND pm.[is_member]=0
                --2.打开游标
                OPEN price_adjust
                --4.定位游标到哪一行
                FETCH FIRST FROM price_adjust INTO @display_id --into的变量数量必须与游标查询结果集的列数相同
                 WHILE @@fetch_status=0  --提取成功,进行下一条数据的提取操作
                 BEGIN
                 --写入临时表分类的ID
                 INSERT INTO #price_display1 SELECT display_id FROM book_class_display where  CHARINDEX(','+replace(@display_id,' ','')+',',','+family_ids) >0    
                 FETCH NEXT  FROM price_adjust INTO @display_id  --移动游标
                 END
                  --关闭游标
                CLOSE price_adjust
                --释放游标
                DEALLOCATE price_adjust    
                      SELECT @qty=COUNT(1),@display_ids=MAX(play.display_id) FROM tb_pdt_price p
                     JOIN book_product_attr a ON p.product_id=a.product_id
                     JOIN tb_pos_client c ON p.server_id=c.server_id
                     JOIN #price_display1 play ON a.display_id=play.display_id
                    WHERE p.product_id=@product_id AND c.store_id=@store_id AND client_type=@client_type         
                    print('---第一级分类打折--'+cast(@qty as varchar(50)));            
                 IF(@qty>0)
                   BEGIN
                      SELECT  @pr_sn=pr_sn FROM tb_promot WHERE pr_sn IN(
                      SELECT MAX(pr.pr_sn) FROM tb_promot_product pr
                      JOIN tb_promot pm ON pr.pr_sn=pm.pr_sn AND pm.end_date>=GETDATE() AND pm.pr_state=0 AND ISNULL(pr.display_id,'')<>''  AND pm.[is_member]=0 AND
                      (pr.display_id= LEFT(@display_ids,2) OR pr.display_id='ROOT') )
                     EXEC 促销商品销售价计算 @pr_sn,@product_id,@server_id
                     DROP TABLE  #price_display1
                     SET @status=1
                   END
            END
END

猜你喜欢

转载自www.cnblogs.com/xielideboke/p/9851166.html
今日推荐