【发布时间】: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