树形表查询SQL

-- =============================================
--   获取当前表所选分类ID下的所有下级分类ID
-- =============================================
ALTER PROC [dbo].[GetTreeTable]
(
    @ID int= null,                --要查询的ID,查询所有输入NULL
    @TableName varchar(100),    --要查询的表名
    @IDName varchar(200),        --主字段名
    @SuperIDName varchar(200)    --上级字段名
)

AS
BEGIN

    --create table #Tab (ID int, SuperID int, Lev int)

    --Declare @Lev int
    DECLARE @StrSQL varchar(5000)
--    Set @Lev=0
--
--    While @Lev=0 or @@ROWCount>0
--    Begin
--        Set @Lev=@Lev+1
--        SET @StrSQL = 'Insert #Tab(ID, SuperID, Lev) Select '+@IDName+', '+@SuperIDName+', '+convert(varchar(10),@Lev)+' From '+@TableName+' Where ('+convert(varchar(10),@Lev)+'=1 and (('+@SuperIDName+' is null))) or ('+@SuperIDName+' in (Select ID From #Tab Where Lev='+convert(varchar(10),@Lev)+'-1)) order by '+@IDName
--        --print @StrSQL
--        EXEC (@StrSQL)
--    End
    SET @StrSQL = '
    WITH DirectReports('+@IDName+', '+@SuperIDName+',Level) AS
    (
        SELECT '+@IDName+', '+@SuperIDName+', 0 AS Level
        FROM '+@TableName+'
        WHERE ('+@SuperIDName+' IS NULL AND '+CONVERT(VARCHAR(100),ISNULL(@ID,''))+' = 0)
        UNION ALL
        SELECT e.'+@IDName+', e.'+@SuperIDName+', Level + 1
        FROM '+@TableName+' e
        INNER JOIN DirectReports d
        ON e.'+@SuperIDName+' = d.'+@IDName+'
    )
   
    SELECT '+@IDName+','+@SuperIDName+',Level
    FROM DirectReports
    ORDER BY Level
    '
    EXEC (@StrSQL)
    PRINT @StrSQL
    --select * from #Tab
    --drop table #Tab
END

 

-- exec [GetTreeTable]    1060,'T_Department','DepID','SuperDepID'

-- exec [GetTreeTable]    NULL,'T_WLFLDY','WLFLID','SJFL'

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值