2017-12-28 75 views
0

저장 프로 시저에서 cte를 사용하고 있습니다.여러 번 생성하고 드롭 다운

나는 CTE가 자동으로 제거 될 때 여러 번, 나는 그것을 해결

감사

;WITH PAYOUT_CTE(REGNKEY, REGNTPE) AS (
    SELECT REG_KEY, 'Parent' 
    FROM ML_MSTR_REGN A (NOLOCK) 
    WHERE A.COMP_NO = @COMP_NO 
     AND  A.REG_KEY = @CUR_KEY 

    UNION ALL 

    SELECT B.REG_KEY, 'Child0' 
    FROM PAYOUT_CTE 
    INNER JOIN ML_MSTR_REGN B 
     ON B.COMP_NO = @COMP_NO 
      AND B.ORG_KEY = PAYOUT_CTE.REGNKEY 
      ) 
SELECT * INTO #PAYOUT_CTE_TMP FROM PAYOUT_CTE 

다른 식별자

내가 떨어 뜨리거나 현재 CTE를 제거하는 방법

에 대한 CTE를 채울 즉 그것을 사용해야합니다 insert 문 다음에 임시 테이블 #PAYOUT_CTE_TMP 만 문제를 일으켰습니다.

+2

제 생각에 CTE는 일반 SQL 코드로 인라인됩니다. 단 하나의 명령문에 대해서만 존재합니다. 성명서가 끝나면 같은 이름의 다른 CTE를 정의 할 수 있습니다. 이 질문에 대한 대답이 있습니까? –

답변

0

이 작업을 볼 수있는 유일한 방법은 CTE 코드를 인라인 테이블 값 함수에 넣고 호출하는 것입니다. 그럼 난 그냥 입력 값을 기준으로 데이터를 생성하기 위해이 테이블 반환 함수에 적용 적용하거나 외부 교차 할 수

CREATE FUNCTION TVFN_PAYOUT_CTE (@COMP_NO INT, @CUR_KEY INT) 
RETURNS TABLE 
AS 
RETURN (

WITH PAYOUT_CTE(REGNKEY, REGNTPE) AS (
    SELECT REG_KEY, 'Parent' 
    FROM ML_MSTR_REGN A (NOLOCK) 
    WHERE A.COMP_NO = @COMP_NO 
     AND  A.REG_KEY = @CUR_KEY 

    UNION ALL 

    SELECT B.REG_KEY, 'Child0' 
    FROM PAYOUT_CTE 
    INNER JOIN ML_MSTR_REGN B 
     ON B.COMP_NO = @COMP_NO 
      AND B.ORG_KEY = PAYOUT_CTE.REGNKEY 
      ) 
SELECT * 
FROM PAYOUT_CTE 
) 

:

코드는 같을 것이다. COMP_NOCUR_KEY"TEST" 테이블의 값은

경우에, 나는 아래와 같이 그들을 그 값으로 CTE를 실행하고 저장 COMP_NOCUR_KEY으로 각 행을 사용할 수

SELECT PC.* 
    INTO #PAYOUT_CTE_TMP 
FROM TEST T 
    CROSS APPLY TVFN_PAYOUT_CTE (T.COMP_NO, T.CUR_KEY) PC 

을 이렇게 CTE가 다시 작성되고 TEST 테이블에서 각 행에 대해 실행됩니다.

+0

좋은 결과를 얻기 위해 UDF를 사용합니다. 탁신. –

+0

@ GLSOFTINDIA 이것이 효과가 있다면, 나는 일부 upvotes 또는 허용 대답을 정말 고맙겠습니다. –