Предположим, у меня есть следующая структура таблицы
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
Я полагаю, что можно было бы использовать временные таблицы для копирования таблицы, а затем каким-то образом использовать идентификатор вставки в мою стандартную таблицу, чтобы начать с elementid и корневого родителя ... однако после этого я довольно много потрачено на то, как рекурсивно обновить все парентиды, элементы в их отношениях ... (возможно ли в SQL Server?).
Я вижу что-то вроде следующего:
CREATE PROCEDURE [dbo]. [Sp_ta_copy_tutorial_by_id]
@eid bigint
КАК
УСТАНОВИТЬ БЕСПЛАТНО
НАЧАТЬ
ОБЪЯВИТЬ @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]
END