zoukankan      html  css  js  c++  java
  • 数据库递归函数

    有这么一个需求,当点击某一类别时,我们需要把这一类别下所有的商品都显示出来。

    现在我要找出某一类别下的所有子类别:

    比如当我点击商城目录时,要把所有的类型ID都找出来,当点击化妆品要把化妆品下所有的ID找到。

    用表值函数递归:

     1 Create function [dbo].[GetCategroyIDList] (@id int)
     2 returns @t table(id int)
     3 as
     4 begin
     5     insert @t select CategoryID from Category where ParentID = @id 
     6     while @@rowcount > 0
     7         insert @t select CategoryID a from Category as a inner join @t as b
     8         on a.ParentID = b.id and a.CategoryID not in(select id from @t)
     9    return
    10 end
    View Code

    当执行:SELECT * from dbo.GetCategroyIDList(2)

    就会把ID为5,6的找到

     注意:

    insert @t select CategoryID a from Category as a inner join @t as b      on a.ParentID = b.id and a.CategoryID not in(select id from @t)

    此处若把CategoryID换成ParentID

    insert @t select CategoryID a from Category as a inner join @t as b      on a.ParentID = b.id and a.ParentID not in(select id from @t)

    则只取到下一级的所有ID

    给这个表生成有规律的代码

    比如AAA,生成一个以AAA开头,后面跟21位数字的代码。AAA----------01

     1 ALTER function [dbo].[CreateCode](
     2 @ebaystockflag varchar(20)--规则字母
     3 )
     4 returns  varchar(100)
     5 AS
     6 BEGIN
     7         declare @dt CHAR(8)
     8         declare @flag varchar(20)
     9         set @flag=@ebaystockflag
    10         set @dt=CONVERT(CHAR(8),GETDATE(),112)
    11         declare @max varchar(100)
    12                 SELECT @max=MAX(CategoryID)
    13                 FROM Category WITH(XLOCK,PAGLOCK)
    14                 WHERE CategoryID like @flag+'%'
    15                 
    16                 set @max=isnull(@max, @flag+'100000000000000000000')--查不到结果给个默认值
    17                 declare @a varchar(100)
    18 declare @num varchar(30)
    19 declare @ordernum varchar(30)
    20 set @a=Convert(varchar,right(@max,len(@max)-3))--截取数字部分
    21 
    22 SET @num = CONVERT(varchar(30),CONVERT(numeric(24,0),@a)+1)
    23 return @flag+@num
    24 END
    标量值函数

    执行

    SELECT dbo.CreateCode('Arl')

    生成Arl100000000000000000001

  • 相关阅读:
    JAVA代码中加了Try...Catch的执行顺序
    Java的注解机制——Spring自动装配的实现原理
    UWP蓝牙的例子
    MIT License
    Windows 运行时组件
    VS 的编译选项 build下的 platform target -- Any CPU和x86有什么影响?
    swfdump——从内存中提取swf的工具
    生成某一文件夹内文件清单(批量处理)
    统一用户认证和单点登录解决方案
    关键路径计算、总时差、自由时差
  • 原文地址:https://www.cnblogs.com/huangzhen22/p/3264205.html
Copyright © 2011-2022 走看看