Farseer

导航

根据子结点寻找父结点

下午遇到一个需求,写一个SQL Function根据一些子结点的OID找到指定层级的父结点.OID,子结点的OID如**,**,**所示.
又一次领略了用SQL写函数和存储过程的别扭,也许是自己用惯了VS.NET随便点点就可以写程序的方式.唉,SQL里居然没有split,郁闷地找了半天,最后用SubString和CharIndex自己模仿了Split的功能.
写出的函数结果如下:

/*********************根据子结点寻找父结点*************************************/
  
/*入口参说明:@SUNOIDS 为待寻找父结点的子结点 形式必须为  OID,OID,OID,OID的形式
          @LEVEL  指定的层级        比如1,2,3
  
*/


   
/*返回参数 @Rusult 得到的父结点集合*/
CREATE    FUNCTION GETPARENTOID(@SUNOIDS VARCHAR(8000),@LEVEL INT)
RETURNS @RESULT TABLE(PARENTOID VARCHAR(40))
AS 
BEGIN
     
DECLARE @SUNOID VARCHAR(40)
     
DECLARE @ROWCOUNT INT
     
     
DECLARE @STARTPOSITION INT       ---SUBSTRING的开始地方
     DECLARE @FLAG INT        ---标志循环是否结束
     DECLARE @SUNOLDOID VARCHAR(40---保持原有值用于比较
     SET @ROWCOUNT = 1
     
SET @STARTPOSITION = 1
     
SET @FLAG = 1

     
--------------如果长度小于一个OID的长度,说明调用方不满足调用要求,直接返回--------
     IF(LEN(@SUNOIDS)<36RETURN

      
WHILE @FLAG<>0
      
BEGIN
          
SET @ROWCOUNT = 1            ----保证SQL语句会查询一次
          
           
----------------------得到每个结点------------------
           SET @SUNOID = SUBSTRING(@SUNOIDS,@STARTPOSITION,36)
           
SET @FLAG = CHARINDEX(',',@SUNOIDS,@FLAG+1)
           
SET @STARTPOSITION = @FLAG+1
           
               
----------------保留该结点-------------
           SET @SUNOLDOID = @SUNOID
               
WHILE @ROWCOUNT<>0
            
BEGIN
                 
SELECT @SUNOID = PARENTOID FROM TBL_SALEORG
                
WHERE OID = @SUNOID AND SOG_BIZLEVEL>@LEVEL
                
SET @ROWCOUNT = @@ROWCOUNT
             
END
        
-------------如果最终得到的结点跟原来结点不同,说明找到了指定层级的父结点,添加到
          IF(@SUNOLDOID<>@SUNOID)
             
INSERT INTO @RESULT VALUES(@SUNOID)      
     
END
     
RETURN     
END

程序倒是很简单,就是SQL一些稀奇古怪的东西搞得烦死人.@@ROWCOUNT 动不动就要自己变,害我浪费一个变量存了一下,这个程序还需要扩展,不过基本实现了功能,懒得动了,简直烦死人.还是等着在SQL Server2005里用C#写算了.

posted on 2005-11-22 21:03  佛西亚  阅读(920)  评论(0编辑  收藏  举报