【问题标题】:SQL Server Stored Procedure (Menu System) - Microsoft SQL Server 2005SQL Server 存储过程(菜单系统)- Microsoft SQL Server 2005
【发布时间】:2011-03-12 12:21:50
【问题描述】:

假设 - 我有以下表结构

elementid, parentid, elementtitle, sortorder 160 0 全新教程 1 161 160 全新教程 新步骤 1 168 5 教程主题 1.1 1 171 168 教程主题 1.1.1 1 172 171 教程主题 1.1.1.1 1

我需要能够设置一个存储过程,以允许我更新 Elementid 和 Parentid 的关系。

这是用于生成树的常规 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

我相信可以使用临时表来复制表,然后以某种方式使用插入到我的标准表中的标识以 elementid 和根父级开始......但是,在那之后我很漂亮在如何递归地更新所有 parentid、elementid 及其关系方面迷失了很多……(在 SQL Server 中可能吗?)。

我看到如下内容:

创建过程 [dbo].[sp_ta_copy_tutorial_by_id] @eid bigint 作为 SET nocount on 开始 声明@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]

结束

【问题讨论】:

  • 没有“MSSQL”之类的东西。我想你可能是指“SQL Server”。
  • Microsoft (MS) SQL(结构化查询语言)MSSQL。 :)

标签: sql-server tsql


【解决方案1】:

查看CTEs (common table expressions)。您可以在存储过程的上下文中使用 CTE 在一些递归之后产生您的菜单数据。实际上,您似乎已经拥有 CTE;该链接描述了该上下文中的递归。

【讨论】:

  • 是的,我熟悉 CTE,并且对使用它们有点自在...我现在只是迷失在哪里更新 parentid 和 elementid 的整个树...即:
【解决方案2】:
创建过程 [dbo].[sp_ta_copy_tutorial_by_id] @eid bigint 作为 SET nocount on 开始 /****************************************** * 创建一个 ******************************************/ 选择 * 进入#tmpA FROM ta_tutorial_elements WHERE elementid IN(从 fn_ta_tutorial_tree_by_element (@EID) 中选择 elementid) /****************************************** * 重复记录 ******************************************/ 声明@CNT INT SET @CNT = (SELECT max(elementid) FROM ta_tutorial_elements) 插入 INTO ta_tutorial_elements (elementtitle, parentid) 从 #tmpA 中选择元素标题、父 ID /****************************************** * 创建 B ******************************************/ 选择 * 进入#tmpB FROM ta_tutorial_elements 元素id > @CNT 选择 bpid.elementid 作为 originalelementid, brow.elementid 作为 newparentid 进入#tmpC FROM #tmpB bpid 左外连接 #tmpA aeid ON bpid.parentid = aeid.elementid 左外连接 ( SELECT elementid, ROW_NUMBER () OVER (ORDER BY elementid ASC) as rownum 来自#tmpA ) arow ON arow.elementid = aeid.elementid 左外连接 ( SELECT elementid, ROW_NUMBER () OVER (ORDER BY elementid ASC) as rownum 来自#tmpB ) brow ON brow.rownum = arow.rownum LEFT OUTER JOIN #tmpB beid ON beid.elementid = brow.elementid 更新#tmpC SET newparentid = 0 哪里 newparentid 为 NULL 更新 t2 SET parentid = t1.newparentid FROM #tmpC t1 左外连接 ta_tutorial_elements t2 ON t1.originalelementid = t2.elementid /****************************************** * 温度显示 ******************************************/ SELECT * FROM ta_tutorial_elements WHERE elementid > @CNT 删除表#tmpA 删除表#tmpB 删除表#tmpC 结尾

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多