日期:2014-05-18  浏览次数:20472 次

CTE递归,游标使用中的问题。
CTE递归,当单独递归一特定的值, 如:WHERE PARENTID = '4P172183-1C'时可以得出结果。如果结合游标多个值递归时得不到结果。请帮忙看下问题出在什么地方?另外如果要对多笔数据进行递归运算,此方法是否可行,或者应该用什么办法?小弟初学,请赐教!

SQL code

--DELETE FROM JIEGUO
DECLARE @ID VARCHAR
DECLARE Cur_Cour SCROLL CURSOR         
FOR
  SELECT  DISTINCT dbo.UDT_M_183.UDF_M_1539
  FROM dbo.UDT_M_183 INNER JOIN dbo.UDT_S_182 ON dbo.UDT_M_183.RID = dbo.UDT_S_182.RID
  WHERE dbo.UDT_S_182.UDF_F_1069 = 'SCJH120206001'
  ORDER BY dbo.UDT_M_183.UDF_M_1539 DESC
open Cur_Cour                               
FETCH NEXT FROM Cur_Cour INTO @ID               
WHILE @@FETCH_STATUS=0
BEGIN
---------------------
    WITH Relation(ID, RCName, ParentID,LVL,Name_List) 
    AS 
      (
      SELECT D.ID, D.RCName ,  ParentID,1 LVL,CAST(RCName AS VARCHAR(255)) Name_List
      FROM  dbo.UDT_M_655 D
--       WHERE PARENTID = '4P172183-1C'
      WHERE PARENTID = @ID
      UNION ALL
      SELECT T.ID, T.RCName, T.ParentID ,LVL+1 LVL
             , CAST((Name_List + '/' + T.RCName) AS VARCHAR(255)) Name_List  
        
      FROM dbo.UDT_M_655 T, Relation P
      WHERE 1=1
             AND P.ID = T.ParentID
      )
      INSERT INTO JIEGUO(ID, RCName, ParentID,LVL,Name_List)
      SELECT ID, RCName, ParentID,LVL,Name_List
   FROM Relation
------------------------------------------
FETCH NEXT FROM Cur_Cour
END
Close  Cur_Cour 
DEALLOCATE  Cur_Cour                   
SELECT *FROM JieGuo


------解决方案--------------------
建议楼主给出你的测试数据和你想实现的结果。大家看看有没有别的方法。
------解决方案--------------------
LZ试试看这样能出你要的结果不?

SQL code
 WITH Relation(ID, RCName, ParentID,LVL,Name_List) 
    AS 
      (
      SELECT D.ID, D.RCName ,  ParentID,1 LVL,CAST(RCName AS VARCHAR(255)) Name_List
      FROM  dbo.UDT_M_655 D
--       WHERE PARENTID = '4P172183-1C'
      WHERE PARENTID IN( SELECT DISTINCT dbo.UDT_M_183.UDF_M_1539
                          FROM dbo.UDT_M_183 INNER JOIN dbo.UDT_S_182 ON dbo.UDT_M_183.RID = dbo.UDT_S_182.RID
                          WHERE dbo.UDT_S_182.UDF_F_1069 = 'SCJH120206001')
      UNION ALL
      SELECT T.ID, T.RCName, T.ParentID ,LVL+1 LVL
             , CAST((Name_List + '/' + T.RCName) AS VARCHAR(255)) Name_List  
        
      FROM dbo.UDT_M_655 T, Relation P
      WHERE 1=1
             AND P.ID = T.ParentID
      )
      
 SELECT * FROM relation

------解决方案--------------------
还是建议来一个唯一标识列,这样比较好处理点
------解决方案--------------------
SQL code
 WITH Relation(ID, RCName, ParentID,LVL,Name_List) 
    AS 
      (
      SELECT D.ID, D.RCName ,  ParentID,1 LVL,CAST(RCName AS VARCHAR(255)) Name_List
      FROM  dbo.UDT_M_655 D
--       WHERE PARENTID = '4P172183-1C'
      WHERE PARENTID IN( SELECT   dbo.UDT_M_183.UDF_M_1539   --去掉这处该死的distinct就行。
                          FROM dbo.UDT_M_183 INNER JOIN dbo.UDT_S_182 ON dbo.UDT_M_183.RID = dbo.UDT_S_182.RID
                          WHERE dbo.UDT_S_182.UDF_F_1069 = 'SCJH120206001')
      UNION ALL
      SELECT T.ID, T.RCName, T.ParentID ,LVL+1 LVL
             , CAST((Name_List + '/' + T.RCName) AS VARCHAR(255)) Name_List  
        
      FROM dbo.UDT_M_655 T, Relation P
      WHERE 1=1
             AND P.ID = T.ParentID
      )
      
 SELECT * FROM relation

------解决方案--------------------
因为你的游标后面FETCH NEXT FROM Cur_Cour
错了
少了 into @id