根据子结点寻找父结点

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

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

None.gif
ExpandedBlockStart.gifContractedBlock.gif   
/**/ /*返回参数 @Rusult 得到的父结点集合*/
None.gif
CREATE      FUNCTION  GETPARENTOID( @SUNOIDS   VARCHAR ( 8000 ), @LEVEL   INT )
None.gif
RETURNS   @RESULT   TABLE (PARENTOID  VARCHAR ( 40 ))
None.gif
AS  
None.gif
BEGIN
None.gif     
DECLARE   @SUNOID   VARCHAR ( 40 )
None.gif     
DECLARE   @ROWCOUNT   INT
None.gif     
None.gif     
DECLARE   @STARTPOSITION   INT         -- -SUBSTRING的开始地方
None.gif
      DECLARE   @FLAG   INT          -- -标志循环是否结束
None.gif
      DECLARE   @SUNOLDOID   VARCHAR ( 40 -- -保持原有值用于比较
None.gif
      SET   @ROWCOUNT   =   1
None.gif     
SET   @STARTPOSITION   =   1
None.gif     
SET   @FLAG   =   1
None.gif
None.gif     
-- ------------如果长度小于一个OID的长度,说明调用方不满足调用要求,直接返回--------
None.gif
      IF ( LEN ( @SUNOIDS ) < 36 RETURN
None.gif
None.gif      
WHILE   @FLAG <> 0
None.gif      
BEGIN
None.gif          
SET   @ROWCOUNT   =   1              -- --保证SQL语句会查询一次
None.gif
          
None.gif           
-- --------------------得到每个结点------------------
None.gif
            SET   @SUNOID   =   SUBSTRING ( @SUNOIDS , @STARTPOSITION , 36 )
None.gif           
SET   @FLAG   =   CHARINDEX ( ' , ' , @SUNOIDS , @FLAG + 1 )
None.gif           
SET   @STARTPOSITION   =   @FLAG + 1
None.gif           
None.gif               
-- --------------保留该结点-------------
None.gif
            SET   @SUNOLDOID   =   @SUNOID
None.gif               
WHILE   @ROWCOUNT <> 0
None.gif            
BEGIN
None.gif                 
SELECT   @SUNOID   =  PARENTOID  FROM  TBL_SALEORG
None.gif                
WHERE  OID  =   @SUNOID   AND  SOG_BIZLEVEL > @LEVEL
None.gif                
SET   @ROWCOUNT   =   @@ROWCOUNT
None.gif             
END
None.gif        
-- -----------如果最终得到的结点跟原来结点不同,说明找到了指定层级的父结点,添加到
None.gif
           IF ( @SUNOLDOID <> @SUNOID )
None.gif             
INSERT   INTO   @RESULT   VALUES ( @SUNOID )      
None.gif     
END
None.gif     
RETURN      
None.gif
END

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

转载于:https://www.cnblogs.com/Farseer1215/archive/2005/11/22/282282.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值