2010-07-06 2 views
1

한다고 가정 - 나는 내가 설정에 나를 elementId로부터의 업데이트 할 수 있도록 저장 프로 시저 할 수 있어야합니다SQL Server 저장 프로 시저 (메뉴 시스템) - 마이크로 소프트 SQL 서버 2005

 
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 

테이블 구조 다음 한 부모 관계. 나는 이상의 테이블을 복사 할 임시 테이블을 사용하는 것이 가능하고 어떻게 든 내 표준 테이블에 삽입의 신원을 사용할 수 있습니다 생각

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 

: 여기

트리를 생성하기위한 내 일반 SQL입니다 elementid와 루트 부모로 시작합니다 ... 그러나, 그 후에는 모든 parentid, elementid의 관계를 재귀 적으로 우회하는 방법에 대해 꽤 많이 분실했습니다 ... (SQL Server에서도 가능합니까?). .

절차는 [DBO] 에 SET NOCOUNT 옵션이 DECLARE을 BEGIN [sp_ta_copy_tutorial_by_id] @eid의 BIGINT AS BIGINT @recid CREATE

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 :

나는 다음과 같은 일을보고 있어요

+0

"MSSQL"과 같은 것이 없습니다. 아마 당신이 "SQL Server"를 의미한다고 생각합니다. –

+0

Microsoft (MS) SQL (Structured Query Language) MSSQL. :) –

답변

0
 
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 
1

CTEs (common table expressions)을 확인하십시오. 저장 프로 시저 컨텍스트 내에서 CTE를 사용하여 일부 재귀 후에 메뉴 데이터를 생성 할 수 있습니다. 실제로 그것은 이미 CTE가있는 것처럼 보입니다. 링크는 해당 컨텍스트 내에서 재귀를 설명합니다.

+0

예, 저는 CTE에 익숙하고 다소 편안합니다 ... 나는 부모님의 ID를 업데이트 할 시점에서 잃어버린 것입니다. 그리고 전체 IDEA는 전체 트리를 잃었습니다 ... 예 : –

관련 문제