代码之家  ›  专栏  ›  技术社区  ›  Joe Garrett

SQL Server存储过程(菜单系统)-Microsoft SQL Server 2005

  •  1
  • Joe Garrett  · 技术社区  · 15 年前

    假设-我有下面的表结构

    elementid, parentid,  elementtitle,          sortorder
    160  0             Brand New Tutorial      1
    161  160           Brand New Tutorial New Step   1
    168  5           Tutorial Topic 1.1      1
    171  168           Tutorial Topic 1.1.1         1
    172  171           Tutorial Topic 1.1.1.1     1
    

    以下是生成树的常规SQL:

     WITH menu AS 
     (
     SELECT parentid, elementid, elementtitle, sortorder FROM dbo.ta_tutorial_elements WHERE (elementid = @eid)
        UNION ALL
        SELECT e.parentid, e.elementid, e.elementtitle, e.sortorderFROM dbo.ta_tutorial_elements AS e INNER JOIN menu AS m ON e.parentid = m.elementid
     )
     SELECT * INTO [#tmpA] FROM menu
    

    我相信可以使用temp表来复制表,然后以某种方式使用插入到我的标准表中的标识,从elementid和根父级开始…但是,在那之后,我几乎不知道如何递归地udpate所有parentid,elementid与它们的关系…(在SQL Server中可能吗?)。

    我看到如下情况:

    创建过程[dbo]。[sp\u ta\u copy\u tutorial\u by \u id] @开斋节 作为 不计数 声明@recid bigint

    SET @recid      = (SELECT IDENT_CURRENT('ta_tutorial_elements'));
    
    WITH menu AS 
    (
    SELECT parentid, elementid, elementtitle, sortorder, userid, createddate FROM dbo.ta_tutorial_elements WHERE (elementid = @eid)
       UNION ALL
       SELECT e.parentid, e.elementid, e.elementtitle, e.sortorder, e.userid, e.createddate FROM dbo.ta_tutorial_elements AS e INNER JOIN menu AS m ON e.parentid = m.elementid
    )
    SELECT * INTO [#tmpA] FROM menu
    
    ALTER TABLE [#tmpA]
    DROP COLUMN elementid
    
    SELECT * INTO [#tmpB] FROM [#tmpA];
    
    UPDATE b SET b.parentid =
        CASE
            WHEN b.parentid <> 0 
            THEN @recid
            ELSE 0
        END
    FROM [#tmpB] as b
    
    INSERT INTO [ta_tutorial_elements] SELECT * FROM [#tmpB]
    DROP TABLE [#tmpA]
    DROP TABLE [#tmpB]
    

    2 回复  |  直到 15 年前
        1
  •  0
  •   Tahbaza    15 年前

    退房 CTEs (common table expressions) . 您可以在存储过程的上下文中使用CTE,在递归之后生成菜单数据。实际上,看起来你已经有了一个CTE;该链接描述了该上下文中的递归。

        2
  •  0
  •   user384929 user384929    15 年前
    @开斋节
    作为
    不计数
    /***************************************
    *创建
    ***************************************/
    来自tau tutorial\u elements
    WHERE elementid IN(按元素(@EID)从fn\u ta\u tutorial\u tree\u中选择elementid)
    
    /***************************************
    声明@CNT INT
    设置@CNT=(从ta\u tutorial\u elements中选择max(elementid))
    
    进入tau tutorial\u元素(elementtitle,parentid)
    从#tmpA中选择elementtitle、parentid
    
    /***************************************
    *创建B
    ***************************************/
    选择*
    进入tmpB
    其中elementid>@碳纳米管
    
    选择bpid.elementid作为originalelementid,
    brow.elementid为newparentid
    从#tmpB bpid左外连接
    #tmpA aeid ON bpid.parentid=aeid.elementid左外联接
    选择elementid,ROW\u NUMBER()OVER(ORDER BY elementid ASC)作为rownum
    )arow ON arow.elementid=aeid.elementid左外联接
    选择elementid,ROW\u NUMBER()OVER(ORDER BY elementid ASC)作为rownum
    来自tmpB
    )brow ON brow.rownum=arow.rownum左外连接
    #tmpB beid ON beid.elementid=浏览.elementid
    
    更新#tmpC
    设置newparentid=0
    其中newparentid为空
    
    更新t2
    t1.originalelementid=t2.elementid上的t2元素
    
    ***************************************/
    选择*FROM ta\u tutorial\u elements WHERE elementid>@碳纳米管
    
    升降台#tmpA
    升降台#tmpB
    升降台#tmpC
    
    结束