web-dev-qa-db-fra.com

Comment créer une table temporaire avec SELECT * INTO table temporaire à partir de la requête CTE

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

Ci-dessous la requête complè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 

108
Learning

É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
190
user1499112

En réalité, le format peut être assez simple - parfois, il n'est pas nécessaire de prédéfinir une table temporaire - elle sera créée à partir des résultats de la sélection.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Donc, à moins que vous vouliez des types différents 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 à la fin de son exécution. Si la procédure stockée A crée une table temporaire et appelle la procédure stockée B, B pourra utiliser la table temporaire créée par A. 

Cependant, il est généralement considéré comme une bonne pratique de codage de supprimer explicitement chaque table temporaire créée.

108
Rohit

Le SELECT ... INTO doit être dans le select 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) 
22
Martin Smith

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

Voici les étapes:

CREATE TEMP TABLE

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

INSERT TEMP SELECT DATA DANS LA TABLE TEMP

-- 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

FINAL STEP DROP LA TABLE

Drop Table #MyTempTable

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

18
Manjunath Bilwar
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 créée directement

0