Comment créer une table temporaire avec SELECT * INTO tempTable FROM Cte Query

J'ai une requête MS SQL CTE à partir de laquelle je veux créer une table temporaire. Je ne suis pas sûr de savoir comment le faire car cela donne une erreur Invalid Object name.

Ci-dessous est toute la requête pour référence

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)

J'apprécierais un point dans la bonne direction ou si je peux créer une table temporaire à partir de cette requête CTE

93
demandé sur DarkAjax 2012-07-15 14:45:41

5 réponses

Échantillon DDL

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

Assurez-vous que la table est supprimée après utilisation

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End
161
répondu Balicanta 2015-11-30 10:15:13

Vraiment le format peut être assez simple-parfois il n'y a pas besoin de prédéfinir une table temporaire-il sera créé à partir des résultats de la sélection.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Donc, à moins que vous ne vouliez différents types ou que vous soyez très strict sur la définition, gardez les choses simples. Notez également que toute table temporaire créée dans une procédure stockée est automatiquement supprimée lorsque la procédure stockée se termine. Si la procédure stockée a crée une table temporaire et appelle la procédure stockée B, alors B pourra utiliser table temporaire créée.

Cependant, il est généralement considéré comme une bonne pratique de codage de supprimer explicitement chaque table temporaire que vous créez de toute façon.

95
répondu Rohit 2015-06-15 06:43:26

Le SELECT ... INTO doit être dans la sélection du 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) 
21
répondu Martin Smith 2012-07-15 10:54:45

Comment utiliser TempTable dans la procédure stockée?

Voici les étapes:

CRÉER UNE TABLE TEMPORAIRE

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

INSÉRER LES DONNÉES DE SÉLECTION DE TEMPÉRATURE DANS LA TABLE DE TEMPÉRATURE

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

SELECT TEMP TABLE (vous pouvez maintenant utiliser cette requête select)

Select EmployeeID from #MyTempTable

DERNIÈRE ÉTAPE DÉPOSEZ LA TABLE

Drop Table #MyTempTable

J'espère que cela vous aidera. Simple et clair:)

13
répondu Manjunath Bilwar 2017-11-06 20:13:06
Select      Eventname, 
            count(Eventname) as 'Counts'
INTO        #TEMPTABLE                                                                                
FROM        tblevent
where       Eventname like 'A%'
Group by    Eventname
order by    count(Eventname)

Ici, en utilisant la clause into, la table est directement créée

-1
répondu linette J Sebastian 2018-05-10 09:48:02