Come creare una tabella Temp con SELECT * INTO tempTable FROM CTE Query


165

Ho una query CTE MS SQL da cui desidero creare una tabella temporanea. Non sono sicuro di come farlo in quanto dà un Invalid Object nameerrore.

Di seguito è l'intera query di riferimento

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)

Gradirei un punto nella giusta direzione o se posso creare una tabella temporanea da questa query CTE



1
@RGI, ​​Entrambe le risposte funzioneranno per il mio caso, gli ho dato Martin, voto positivo dato che posso scegliere solo una risposta. Apprezzo la tua risposta Ho dato la tua preferenza di risposta alla sua come hai menzionato anche parte della cancellazione della query temporanea. Up-Vote for your also ..
Imparare il

Risposte:


238

DDL di esempio

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

Assicurarsi che la tabella venga eliminata dopo l'uso

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End

6
Perché il doppio periodo? È un errore di battitura?
Mike Cole,

18
Il .. è omettere di specificare lo schema. Per ex tempdb.dbo. # Temp. Invece di questo possiamo digitare tempdb .. # temp.
sam,

7
Questo non risponde alla domanda. L'OP ha specificamente chiesto come farlo con Select Into, e questa risposta non lo fa. È una buona risposta, ma non è la risposta giusta.
DaveInAZ,

167

In realtà il formato può essere abbastanza semplice - a volte non è necessario predefinire una tabella temporanea - verrà creato dai risultati della selezione.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Quindi, a meno che tu non voglia tipi diversi o non sia molto severo nella definizione, mantieni le cose semplici. Si noti inoltre che qualsiasi tabella temporanea creata all'interno di una procedura memorizzata viene automaticamente eliminata al termine dell'esecuzione della procedura memorizzata. Se la procedura memorizzata A crea una tabella temporanea e chiama la procedura memorizzata B, B sarà in grado di utilizzare la tabella temporanea che A ha creato.

Tuttavia, è generalmente considerata una buona pratica di codifica eliminare esplicitamente ogni tabella temporanea che si crea comunque.


4
Per quanto tempo è disponibile la tabella temporanea nel database dopo l'esecuzione se non la rimuovo usando la tabella di rilascio nel mio codice? perché eseguo due volte il codice select * into #tempma, la seconda volta che l'esecuzione esegue un errore: "La tabella #temp esiste già nel database" .
Kurapika,

6
@Kurapika la durata della connessione
Jonesopolis

7
Il fatto che non è necessario creare esplicitamente la tabella prima di utilizzarla È il fatto più rilevante in questa risposta. Grazie!
Alfabravo

24

Le SELECT ... INTOnecessità di essere nel selezionare dal 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) 

24

Come utilizzare TempTable in stored procedure?

Ecco i passaggi:

CREA TABELLA TEMP

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

INSERISCI TEMP SELEZIONA DATI NELLA TABELLA TEMP

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

SELEZIONA TABELLA TEMP (Ora puoi usare questa query di selezione)

Select EmployeeID from #MyTempTable

PASSAGGIO FINALE GOCCIA LA TABELLA

Drop Table #MyTempTable

Spero che questo possa aiutare. Semplice e chiaro :)


5
Questo non risponde alla domanda. L'OP ha chiesto specificamente come farlo con Select Into e questa risposta non lo fa.
DaveInAZ,

4
Select      Eventname, 
            count(Eventname) as 'Counts'
INTO        #TEMPTABLE                                                                                
FROM        tblevent
where       Eventname like 'A%'
Group by    Eventname
order by    count(Eventname)

Qui usando la clausola into la tabella viene creata direttamente


3
In che modo differisce dalle risposte esistenti?
zx8754,

1

Ecco una leggera modifica alle risposte di una query che crea la tabella al momento dell'esecuzione (ovvero non è necessario creare prima la tabella):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.