2011-05-13 4 views
1

현재 하나의 CTE를 사용하는 저장 프로 시저가 있습니다. 이 기능은 다음과 같이 작동합니다.SQL 값을 지정하지 않고 임시 테이블에 삽입 하시겠습니까?

WITH MY_CTE AS 
(
    // Logic here uses SELECT * from a single table. 
) 
SELECT * 
INTO #Tasks 
FROM MY_CTE; 

이제 선택적으로 원래의 임시 테이블에 더 많은 데이터를 추가 할 다른 CTE를 호출해야한다는 요구 사항이 있습니다. 나는 이런 식으로 뭔가를 기대했다 :

IF @Option = 1 
    BEGIN 
     INSERT INTO #Tasks 
     (
      WITH MY_OTHER_CTE 
      (
       // Logic here uses SELECT * from same table as first CTE. 
      ) 
      SELECT * 
      FROM MY_OTHER_CTE 
     ) 
    END 

문제는 INSERT INTO #Tasks 호출이 VALUES 열을 지정이 필요하다는 것이다. 두 테이블 모두 CTE의 반환 레코드입니다. 원래 저장 프로 시저의 장점은 SELECT *을 사용했기 때문에 해당 테이블의 열이 변경된 경우에도 작동한다는 것입니다. I 은 공유 테이블에있는 항목을 알고있는 열을 지정하지만이 이점은 손실됩니다 (이 특별한 경우에는 매우 유용한 이점 임). 내가하고 싶은 일을 성취 할 수있는 방법이 있는가? 그들이 같은 테이블에서 선택하고 열이 항상 일치한다는 것을 알았습니까?

답변

3

이 방법이 효과가 있습니까?

;WITH MY_OTHER_CTE AS 
(
    // Logic here uses SELECT * from same table as first CTE. 
) 
INSERT INTO #Tasks 
    SELECT * 
    FROM MY_OTHER_CTE 
는 (따라서 임시 테이블)에서 선택하고 테이블에 ID 열이있는 경우 당신은 또 다른 도전이있을 수 있습니다

나는 "의무가 열을 목록으로 시작합니다
+0

멋진 작품입니다. 나는 올바른 구문을 가지고 있지 않은 것 같아요. 그래도 잠재적 인 신분증 열 문제에 대해 자세히 설명해 주시겠습니까? 테이블에 ID 열이 있지만 여전히 잘 작동하는 것 같습니다. 두 번째 CTE는 첫 번째 CTE에서 첫 번째 CTE를 삽입 할 가능성이 없으므로 그 유일한 관심사였습니까? 감사. – Ocelot20

+0

내 자신의 테스트에서 ID 열에이 오류가 발생했습니다. " '#Tasks'테이블의 ID 열에 대한 명시 적 값은 열 목록이 사용되고 IDENTITY_INSERT가 ON 일 때만 지정할 수 있습니다." 그래서 시험, 시험, 시험, 행운. –

2

좋은 연습입니다 6 천 354 가지 이유로. " 하지만 우리는 모두 당신이 할 수없는 곳에있었습니다 ;-)

어쨌든, 내가이 문제를 해결할 방법은 파생 테이블 & 노동 조합입니다. 여기서 핵심은 일련의 UNION을 수행하고 WHERE 조건을 사용하여 실행하고 싶지 않은 쿼리를 삭제하는 것입니다. 분명히 내가 무시 생각

WITH MY_CTE AS (

    SELECT * 
    FROM (
     SELECT * 
     FROM FirstTable 
     WHERE <your criteria here> 

      UNION 

     SELECT * 
     FROM FirstTable_OR_SomeOtherTable 
     WHERE <your criteria> 
      AND @Option1 = 1 

      UNION 

     SELECT * 
     FROM OnAndOnAndSoOn 
     WHERE <your criteria> 
      AND @Option2 = 1 

    ) AS MyDerivedTable 
) 
SELECT * 
INTO #Tasks 
FROM MY_CTE; 

EDIT .... 모든 테이블이 작동하려면 같은 순서로 같은 데이터 유형을 가질 필요가 있지만, 코드가 같은 것을 볼 수 있었다 당신의 "두 개의 CTE의" 요청하지만, 나는 이것이 당신을 같은 장소로 데려 갈 것이라고 생각합니다.