偶是sql菜鸟,水平不够,请各位大侠支着:
一个类目表中有三个字段:Id(自增),ColumnTypeName,ParentId,如果这个类目是最上级类目,它的ParentId就设为-1,若不是就设为此表中另一个类目的Id,也就是各层目录放在同一个表中,目前我只需要实现两层目录。现在我编个存储过程想实现以下想法,注释中有
ALTER PROCEDURE GetSiblingColumnType    (
        @ColumnTypeId int
    )AS
    
    DECLARE @Parent int
    DECLARE @ParentName varchar(50)
    SELECT @Parent=ParentId,@ParentName=ColumnTypeName FROM kjcColumnType WHERE Id=@ColumnTypeId --保存上级目录ID和本级目录名
    IF @Parent != -1 --如果不是最上级目录
     BEGIN     
     SELECT Id,ColumnTypeName FROM kjcColumnType WHERE Id=@Parent --就返回同级目录的Id和名字
     RETURN @ParentName --同时返回上级目录名作为整个栏目名
     END
ELSE --否则,即已经是最上级目录
BEGIN 
     RETURN @ParentName + '-1' --就返回本级目录名作为整个栏目名,为了区别,在其后面添上一个“-1”,让业务层读取substring分析
     END问题是这里有两个SELECT语句,而且有一个在判断段中,不知道ASP.NET业务层中的SqlReader如何去获取数据,或者能否设计一个更加精巧的存储过程,在一个SELECT中就满足需要呢?我搞了好几天了,就卡在这儿,人家催得急,请大家多多指教,鞠躬多谢!

解决方案 »

  1.   

    可以用
    select 。。
    union
    select 。。
    要求两个返回字段要一致
    ------------------------------------
    我的团队:www.51team.com欢迎访问,有志者共谋事,每天都有惊喜,SOHO
      

  2.   

    --适用于多层目录
    select a.Id,a.ColumnTypeName,
           case when (select count(*) from kjcColumnType where id=a.parentid)>1 then  
     (select parentname from kjcColumnType where id=a.parentid) else a.columntypename end  as parentname
    from kjcColumnType a 
    where a.id=@ColumnTypeId
      

  3.   

    谢谢各位的启发!我还是没有搞定,只好就在业务层里直接调用sql语句了,呵呵