Como criar tabela Temp com consulta SELECT * INTO tempTable FROM CTE

165

Eu tenho uma consulta MS SQL CTE a partir da qual desejo criar uma tabela temporária. Não tenho certeza de como fazê-lo, pois dá um Invalid Object nameerro.

Abaixo está toda a consulta para referência

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)

Eu apreciaria um ponto na direção certa ou se eu posso criar uma tabela temporária a partir desta consulta CTE

Aprendendo
fonte
Aqui está como fazê-lo stackoverflow.com/questions/3306096/…
Luxspes
1
@RGI, ​​Ambas as respostas funcionarão no meu caso, dei a ele Martin, voto positivo, já que posso escolher apenas uma resposta. Agradeço sua resposta. Dei a sua preferência de resposta sobre a dele, como você mencionou parte de exclusão da consulta temporária também. Voto positivo para o seu também .. #
Aprendendo

Respostas:

238

DDL de amostra

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

Certifique-se de que a tabela seja excluída após o uso

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End
Balicanta
fonte
6
Por que o período duplo? Isso é um erro de digitação?
Mike Cole
18
O .. é omitir a especificação do esquema. Para ex tempdb.dbo. # Temp. Em vez disso, podemos digitar tempdb .. # temp.
sam
7
Isso não responde à pergunta. O OP perguntou especificamente como fazer isso com o Select Into, e essa resposta não faz isso. É uma boa resposta, mas não é a resposta certa.
DaveInAZ
167

Realmente, o formato pode ser bastante simples - às vezes não há necessidade de predefinir uma tabela temporária - ela será criada a partir dos resultados da seleção.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Portanto, a menos que você queira tipos diferentes ou seja muito rigoroso quanto à definição, mantenha as coisas simples. Observe também que qualquer tabela temporária criada dentro de um procedimento armazenado é descartada automaticamente quando o procedimento armazenado termina a execução. Se o procedimento armazenado A criar uma tabela temporária e chamar o procedimento armazenado B, B poderá usar a tabela temporária que A criou.

No entanto, geralmente é uma boa prática de codificação eliminar explicitamente todas as tabelas temporárias criadas de qualquer maneira.

Rohit
fonte
4
Quanto tempo está disponível a tabela temporária no banco de dados após a execução, se eu não removê-lo usando a tabela suspensa no meu código? porque eu executo o código duas vezes select * into #temp, mas, na segunda vez, a execução gera um erro: "A tabela #temp já existe no banco de dados" .
precisa
6
@Kurapika a duração da conexão #
Jonesopolis 14/03
7
O fato de não precisarmos criar explicitamente a tabela antes de usá-la é o fato mais relevante nesta resposta. Obrigado!
Alfabravo 14/03
24

O SELECT ... INTOprecisa estar no select do 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
fonte
24

Como usar TempTable no procedimento armazenado?

Aqui estão os passos:

CRIAR TABELA DE TEMP

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

INSERIR TEMP SELECIONAR DADOS NA TABELA DE TEMP

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

SELECT TEMP TABLE (Agora você pode usar esta consulta de seleção)

Select EmployeeID from #MyTempTable

PASSO FINAL DEIXAR A MESA

Drop Table #MyTempTable

Espero que isso ajude. Simples e claro :)

Manjunath Bilwar
fonte
5
Isso não responde à pergunta. O OP perguntou especificamente como fazer isso com o Select Into, e essa resposta não faz isso.
DaveInAZ 17/01
4
Select      Eventname, 
            count(Eventname) as 'Counts'
INTO        #TEMPTABLE                                                                                
FROM        tblevent
where       Eventname like 'A%'
Group by    Eventname
order by    count(Eventname)

Aqui, usando a cláusula into, a tabela é criada diretamente

linette J Sebastian
fonte
3
Como isso é diferente das respostas existentes?
Zx8754
1

Aqui está uma pequena alteração nas respostas de uma consulta que cria a tabela após a execução (ou seja, você não precisa criar a tabela primeiro):

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