Хранимая процедура SQL Server (система меню) - Microsoft SQL Server 2005 - PullRequest
1 голос
/ 07 июля 2010

Предположим, у меня есть следующая структура таблицы

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

Ответы [ 2 ]

1 голос
/ 07 июля 2010

Извлечение CTE (общие табличные выражения) . Вы можете использовать CTE в контексте хранимой процедуры, чтобы получить данные вашего меню после некоторой рекурсии. На самом деле, похоже, у вас уже есть CTE; ссылка описывает рекурсию в этом контексте.

0 голосов
/ 07 июля 2010
CREATE PROCEDURE [dbo].[sp_ta_copy_tutorial_by_id]
    @eid bigint
AS
SET nocount on
BEGIN
/***************************************
*     CREATE A
***************************************/
SELECT            *
INTO        #tmpA
FROM        ta_tutorial_elements
WHERE       elementid IN (SELECT elementid from fn_ta_tutorial_tree_by_element (@EID))

/***************************************
*     DUPLICATE RECORDS
***************************************/
DECLARE           @CNT INT
SET               @CNT = (SELECT max(elementid) FROM ta_tutorial_elements)

INSERT            
INTO        ta_tutorial_elements (elementtitle, parentid)
            SELECT elementtitle, parentid FROM #tmpA

/***************************************
*     CREATE B 
***************************************/
SELECT            * 
INTO        #tmpB
FROM        ta_tutorial_elements
WHERE       elementid > @CNT

SELECT            bpid.elementid as originalelementid, 
                  brow.elementid as newparentid
INTO        #tmpC
FROM        #tmpB bpid LEFT OUTER JOIN
                  #tmpA aeid ON bpid.parentid = aeid.elementid LEFT OUTER JOIN
                  (
                        SELECT            elementid, ROW_NUMBER () OVER (ORDER BY elementid ASC) as rownum
                        FROM        #tmpA
                  ) arow ON arow.elementid = aeid.elementid LEFT OUTER JOIN
                  (
                        SELECT            elementid, ROW_NUMBER () OVER (ORDER BY elementid ASC) as rownum
                        FROM        #tmpB
                  ) brow ON brow.rownum = arow.rownum LEFT OUTER JOIN
                  #tmpB beid ON beid.elementid = brow.elementid 

UPDATE            #tmpC 
SET               newparentid = 0
WHERE       newparentid IS NULL

UPDATE            t2
SET               parentid = t1.newparentid
FROM        #tmpC t1 LEFT OUTER JOIN
                  ta_tutorial_elements t2 ON t1.originalelementid = t2.elementid

/***************************************
*     TEMP DISPLAY
***************************************/
SELECT * FROM ta_tutorial_elements WHERE elementid > @CNT

DROP TABLE  #tmpA
DROP TABLE  #tmpB
DROP TABLE  #tmpC

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...