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

Esto funciona bienAlcance de un CTE en SQL Server 2005

Si la misma consulta se escribe así.

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

se da un mensaje diciendo emp_CTE no existe.

¿Hay alguna manera de solucionar este problema?

gracias Prince

Respuesta

10

El CTE es parte de la única declaración posterior.

La declaración posterior puede ser una sola SELECT/INSERT/UPDATE/DELETE, o un compuesto (con UNION, INTERSECT etc)

Por ejemplo:

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

La regla de oro es que la alcance es hasta donde estaría el próximo ;. Un punto y coma termina cualquier declaración, pero desafortunadamente es opcional.

Su código no anterior es en realidad este

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

Así que el CTE es única en su alcance hasta ...EMPLOYEES;

+1

el milagro de desbordamiento de pila es que me puedo sentar aquí en casi 1.030 pm, hora local, beber una cerveza y me pregunto por qué mi código no funciona y luego, en cuestión de segundos, encontraré exactamente lo que necesitaba. – wootscootinboogie

10

En resumen: NO. Un CTE es válido exactamente para la declaración única siguiente, no más. Y tampoco hay forma de "extender" la vida de un CTE.

De MSDN Books Online:

Una expresión de tabla común (CTE) se puede considerar como un conjunto temporal resultado que se define dentro del alcance ejecución de un solo SELECT, INSERT, UPDATE, DELETE o la instrucción CREATE VIEW. Un CTE es similar a una tabla derivada, ya que no se almacena como un objeto y dura solo durante la consulta.

Puede:

  • des la CTE en un ver y usar ese punto de vista de sus consultas - vistas están disponibles, siempre y cuando se definen

  • tienda de los resultados de la CTE en una tabla temporal o variable de tabla para su posterior procesamiento

  • cambie sus instrucciones después del CTE para que puedan ejecutarse como una sola estadística EMENT

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