Cómo crear una tabla temporal con SELECT * INTO tempTable FROM CTE Query

165

Tengo una consulta MS SQL CTE a partir de la cual quiero crear una tabla temporal. No estoy seguro de cómo hacerlo, ya que da un Invalid Object nameerror.

A continuación se muestra la consulta completa para referencia

SELECT * INTO TEMPBLOCKEDDATES FROM 
;with Calendar as (
    select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays,EventStartTime,EventEndTime, EventRecurring, EventStartDate as PlannedDate
    ,EventType from EventCalender
    where EventActive = 1 AND LanguageID =1 AND EventBlockDate = 1
    union all
    select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays,EventStartTime,EventEndTime, EventRecurring, dateadd(dd, 1, PlannedDate)
    ,EventType from Calendar
    where EventRecurring = 1
        and dateadd(dd, 1, PlannedDate) <= EventEndDate 
)
select EventID, EventStartDate, EventEndDate, PlannedDate as [EventDates], Cast(PlannedDate As datetime) AS DT, Cast(EventStartTime As time) AS ST,Cast(EventEndTime As time) AS ET, EventTitle
,EventType from Calendar
where (PlannedDate >= GETDATE()) AND ',' + EventEnumDays + ',' like '%,' + cast(datepart(dw, PlannedDate) as char(1)) + ',%'
    or EventEnumDays is null
order by EventID, PlannedDate
option (maxrecursion 0)

Agradecería un punto en la dirección correcta o si puedo crear una tabla temporal a partir de esta consulta CTE

Aprendizaje
fuente
Aquí es cómo hacerlo stackoverflow.com/questions/3306096/…
Luxspes
1
@RGI, ​​Ambas respuestas funcionarán para mi caso, le di a Martin un voto positivo ya que solo puedo elegir una respuesta. Agradezco tu respuesta. Le di preferencia a su respuesta sobre la suya, ya que también mencionó la eliminación de parte de la consulta temporal. Up-Vote por su también ..
Aprendizaje

Respuestas:

238

DDL de muestra

create table #Temp
(
    EventID int, 
    EventTitle Varchar(50), 
    EventStartDate DateTime, 
    EventEndDate DatetIme, 
    EventEnumDays int,
    EventStartTime Datetime,
    EventEndTime DateTime, 
    EventRecurring Bit, 
    EventType int
)

;WITH Calendar
AS (SELECT /*...*/)

Insert Into #Temp
Select EventID, EventStartDate, EventEndDate, PlannedDate as [EventDates], Cast(PlannedDate As datetime) AS DT, Cast(EventStartTime As time) AS ST,Cast(EventEndTime As time) AS ET, EventTitle
,EventType from Calendar
where (PlannedDate >= GETDATE()) AND ',' + EventEnumDays + ',' like '%,' + cast(datepart(dw, PlannedDate) as char(1)) + ',%'
    or EventEnumDays is null

Asegúrese de que la tabla se elimine después de usar

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End
Balicanta
fuente
66
¿Por qué el doble período? ¿Es eso un error tipográfico?
Mike Cole
18
El ... es omitir especificar el esquema. Para ex tempdb.dbo. # Temp. En lugar de eso, podemos escribir tempdb .. # temp.
sam
77
Esto no responde la pregunta. El OP preguntó específicamente cómo hacerlo con Select Into, y esta respuesta no lo hace. Es una buena respuesta, pero no es la respuesta correcta.
DaveInAZ
167

Realmente el formato puede ser bastante simple, a veces no es necesario predefinir una tabla temporal, se creará a partir de los resultados de la selección.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Entonces, a menos que desee diferentes tipos o sea muy estricto en la definición, mantenga las cosas simples. Tenga en cuenta también que cualquier tabla temporal creada dentro de un procedimiento almacenado se descarta automáticamente cuando el procedimiento almacenado termina de ejecutarse. Si el procedimiento almacenado A crea una tabla temporal y llama al procedimiento almacenado B, entonces B podrá usar la tabla temporal que A creó.

Sin embargo, generalmente se considera una buena práctica de codificación descartar explícitamente cada tabla temporal que cree de todos modos.

Rohit
fuente
44
¿Cuánto tiempo está disponible la tabla temporal en la base de datos después de la ejecución si no la elimino usando la tabla desplegable en mi código? porque ejecuté dos veces el código select * into #temppero, la segunda vez, la ejecución muestra un error: "La tabla #temp ya existe en la base de datos" .
Kurapika
66
@Kurapika la duración de la conexión
Jonesopolis
77
El hecho de que no necesitemos crear explícitamente la tabla antes de usarla ES el hecho más relevante en esta respuesta. ¡Gracias!
Alfabravo
24

La SELECT ... INTOnecesidad de estar en la selección del CTE.

;WITH Calendar
     AS (SELECT /*... Rest of CTE definition removed for clarity*/)
SELECT EventID,
       EventStartDate,
       EventEndDate,
       PlannedDate                   AS [EventDates],
       Cast(PlannedDate AS DATETIME) AS DT,
       Cast(EventStartTime AS TIME)  AS ST,
       Cast(EventEndTime AS TIME)    AS ET,
       EventTitle,
       EventType
INTO TEMPBLOCKEDDATES /* <---- INTO goes here*/        
FROM   Calendar
WHERE  ( PlannedDate >= Getdate() )
       AND ',' + EventEnumDays + ',' LIKE '%,' + Cast(Datepart(dw, PlannedDate) AS CHAR(1)) + ',%'
        OR EventEnumDays IS NULL
ORDER  BY EventID,
          PlannedDate
OPTION (maxrecursion 0) 
Martin Smith
fuente
24

¿Cómo usar TempTable en el procedimiento almacenado?

Aquí están los pasos:

CREAR TABLA DE TEMPERATURA

-- CREATE TEMP TABLE 
Create Table #MyTempTable (
    EmployeeID int
);

INSERTAR TEMP SELECCIONAR DATOS EN LA TABLA DE TEMP

-- INSERT COMMON DATA
Insert Into #MyTempTable
Select EmployeeID from [EmployeeMaster] Where EmployeeID between 1 and 100

TABLA DE TEMPERATURA SELECCIONADA (ahora puede usar esta consulta de selección)

Select EmployeeID from #MyTempTable

PASO FINAL DEJAR LA MESA

Drop Table #MyTempTable

Espero que esto sea de ayuda. Simple y claro :)

Manjunath Bilwar
fuente
55
Esto no responde la pregunta. El OP preguntó específicamente cómo hacerlo con Select Into, y esta respuesta no lo hace.
DaveInAZ
4
Select      Eventname, 
            count(Eventname) as 'Counts'
INTO        #TEMPTABLE                                                                                
FROM        tblevent
where       Eventname like 'A%'
Group by    Eventname
order by    count(Eventname)

Aquí, usando la cláusula into, la tabla se crea directamente

linette J Sebastian
fuente
3
¿Cómo es esto diferente de las respuestas existentes?
zx8754
1

Aquí hay una pequeña alteración a las respuestas de una consulta que crea la tabla después de la ejecución (es decir, no tiene que crear la tabla primero):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
John Gilmer
fuente