2011-07-27 5 views
9
WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, * 
    FROM dbo.employee) 
SELECT * FROM emp_CTE 

범위는 2005

잘 작동합니다.

WITH emp_CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, * 
    FROM dbo.employee) 
SELECT * FROM EMPLOYEES  
SELECT * FROM emp_CTE 

emp_CTE이 존재하지 않는다는 메시지가 나타납니다.

이 문제를 극복 할 수있는 방법이 있습니까?

감사 짧은 프린스

답변

10

장담.

;WITH cte1 AS 
(
    select ... 
), cte2 AS 
(
    select ... 
) 
SELECT ... 
UNION 
SELECT ...; 

어림짐작는 점이다

후속 명령문 (INTERSECT 등 UNION 포함) 예를 들어

단일 SELECT/INSERT/갱신/삭제 또는 화합물 일 수있다 범위는 다음 ;이 될 때까지입니다. 세미콜론은 모든 명령문을 종료하지만 불행히도 선택 사항입니다.

당신의 실패 위의 코드는 그래서 CTE는 스택 오버플로의 기적은 내가 거의 1,030 현지 시간 오후, 음주 여기 앉아서 할 수 있다는 것입니다 최대 ...EMPLOYEES;

+1

까지만 범위에 실제로

...; WITH emp_CTE AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS IdentityId, * FROM dbo.employee) SELECT * FROM EMPLOYEES; SELECT * FROM emp_CTE; 

입니다 맥주가 왜 내 코드가 작동하지 않는지 궁금해하고 몇 초 만에 내가 필요한 것을 찾아 낸다. – wootscootinboogie

10

: NO. CTE는 다음 단일 성명에 대해 유효합니다. CTE의 수명을 "연장"할 수있는 방법도 없습니다. MSDN Books Online 가입일

:

공통 테이블 식 (CTE)를 SELECT, INSERT, UPDATE, 단일 삭제하려면 의 실행 범위에 정의 된 임시 결과 집합으로 간주 될 수

, 또는 CREATE VIEW 문. CTE는 쿼리 기간 동안 만 지속되는 개체 및 으로 저장되지 않는다는 점에서 파생 테이블과 비슷한 입니다.

할 수 있습니다 :

  • 은보기에 당신의 CTE를 켜고 쿼리에 대한 해당 뷰 사용

    - 한 그들이

  • 상점에게 결과를 정의 된 바와 같은 전망을 사용할 수 있습니다를 CTE를 임시 테이블이나 테이블 변수에 추가 처리하려면

  • CTE 이후에 진술을 변경하여 단일 통계로 실행할 수 있도록하십시오. 열팽창 계수는 다음의 문장의 일부입니다

    WITH emp_CTE AS (
    ......) 
    SELECT (list of columns) 
    FROM emp_CTE 
    INNER JOIN dbo.Employees e ON ......