T-SQL存储过程:类别链提取

提取类别链

 

表结构:

PCID,CategoryName,ParentID

1      衬衫                0

2      裤子                0

3      长袖衬衫          1

4      长袖条纹衬衫     3
 1 set  ANSI_NULLS  ON
 2 set  QUOTED_IDENTIFIER  ON
 3 go
 4
 5 /* 创建:***
 6*  时间:200*/
0 */ 16
 7 *   用途:获取从根结点到叶结点的类别链条
 8 */
 9 CREATE   PROCEDURE   [ dbo ] . [ GetCategorys ]
10 AS
11 DECLARE
12 @CACHE_PCID   int ,                            -- 缓存PCID
13 @OUT_STR   nvarchar ( 500 ),                 -- 输出的类别链条
14 @CACHE_PARENTID   int ,                     -- 缓存的父类别ID
15 @CACHE_CATENAME   nvarchar ( 20 )      -- 缓存的类别名字
16 BEGIN
17 -- 获取所有独立叶结点类别
18 -- -------------------------------------------------------------------------
19 DECLARE  ENDPOINT_CURSOR  CURSOR   FOR
20 select  C.PCID  from
21 (
22      select   distinct  PCID  from  w_ProductCategorys
23 ) C
24 left   outer   join
25 (
26 -- #PID带子类别的类别
27 select   distinct  B.ParentID  from
28 (
29      select  PCID,ParentID  from  w_ProductCategorys
30 ) A 
31 right   outer   join
32 (
33      select  PCID,ParentID  from  w_ProductCategorys
34 ) B
35 on  A.PCID = B.ParentID  where  A.PCID  is   not   null
36 -- #PID
37 ) D
38 on  C.PCID = D.ParentID  where  D.ParentID  is   null
39 -- -------------------------------------------------------------------------
40 -- 临时表
41 SELECT  PCID,ParentID,CategoryName  INTO  #Temp_TAB  FROM  w_ProductCategorys
42 -- 打开游标
43 OPEN  ENDPOINT_CURSOR;
44
45 FETCH   NEXT   FROM  ENDPOINT_CURSOR  INTO   @CACHE_PCID ;
46 -- 游标循环
47 WHILE   @@FETCH_STATUS = 0
48 BEGIN
49      -- 循环分析PCID、ParentID,获取类别链条
50      -- 获取父类别
51      SET   @CACHE_PARENTID = ( SELECT  ParentID  FROM  #Temp_TAB);
52      -- 获取叶结点类别名
53      SET   @OUT_STR = ( SELECT  CategoryName  FROM  #Temp_TAB  WHERE  PCID = @CACHE_PCID );
54      -- 开始循环
55      WHILE   @CACHE_PARENTID != 0
56      BEGIN         
57          SET   @CACHE_CATENAME = ( SELECT  CategoryName  From  #Temp_TAB  WHERE  PCID = @CACHE_PARENTID );
58          SET   @OUT_STR = @CACHE_CATENAME + ' ---- ' + @OUT_STR ;
59          SET   @CACHE_PARENTID = ( SELECT  ParentID  FROM  #Temp_TAB  WHERE  PCID = @CACHE_PARENTID );
60      END
61     
62      PRINT ( @OUT_STR );
63      SET   @OUT_STR = '' ;
64     
65      FETCH   NEXT   FROM  ENDPOINT_CURSOR  INTO   @CACHE_PCID ;
66 END
67 -- 关闭游标
68 CLOSE  ENDPOINT_CURSOR;
69 DEALLOCATE  ENDPOINT_CURSOR

70END

你可能感兴趣的:(t-sql)