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

165

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

Vous trouverez ci-dessous 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

Apprentissage
la source
Voici comment le faire stackoverflow.com/questions/3306096/…
Luxspes
1
@RGI, ​​les deux réponses fonctionneront pour mon cas, je lui ai donné Martin, vote positif car je ne peux choisir qu'une seule réponse. J'apprécie votre réponse. J'ai donné la préférence à votre réponse par rapport à la sienne, car vous avez également mentionné la suppression d'une partie de la requête temporaire. Votez pour votre aussi ..
Apprendre le

Réponses:

238

Exemple de 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 le tableau est supprimé après utilisation

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End
Balicanta
la source
6
Pourquoi la double période? Est-ce une faute de frappe?
Mike Cole
18
Le .. est d'omettre de spécifier le schéma. Pour ex tempdb.dbo. # Temp. Au lieu de cela, nous pouvons taper tempdb .. # temp.
sam
7
Cela ne répond pas à la question. Le PO a spécifiquement demandé comment le faire avec Select Into, et cette réponse ne fait pas cela. C'est une bonne réponse, mais ce n'est pas la bonne réponse.
DaveInAZ
167

En réalité, le format peut être assez simple - parfois il n'est pas nécessaire 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 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 lorsque la procédure stockée termine 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 que vous créez de toute façon.

Rohit
la source
4
Combien de temps la table temporaire est-elle disponible dans la base de données après l'exécution si je ne la supprime pas en utilisant la table de dépôt dans mon code? parce que j'exécute deux fois le code select * into #tempmais, la deuxième fois l'exécution délivre une erreur: "La table #temp existe déjà dans la base de données" .
Kurapika
6
@Kurapika la durée de la connexion
Jonesopolis
7
Le fait que nous n'ayons pas besoin de créer explicitement le tableau avant de l'utiliser EST le fait le plus pertinent dans cette réponse. Merci!
Alfabravo
24

Les SELECT ... INTObesoins doivent ê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) 
Martin Smith
la source
24

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

Voici les étapes:

CRÉER UNE TABLE DE TEMPÉRATURE

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

INSÉRER LES DONNÉES DE SÉLECTION DE TEMPÉRATURE DANS LE TABLEAU DE 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 de sélection)

Select EmployeeID from #MyTempTable

ÉTAPE FINALE DÉPOSEZ LA TABLE

Drop Table #MyTempTable

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

Manjunath Bilwar
la source
5
Cela ne répond pas à la question. Le PO a spécifiquement demandé comment le faire avec Select Into, et cette réponse ne fait pas cela.
DaveInAZ
4
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

linette J Sebastian
la source
3
En quoi est-ce différent des réponses existantes?
zx8754
1

Voici une légère modification des réponses d'une requête qui crée la table lors de l'exécution (c'est-à-dire que vous n'avez pas à créer la table au préalable):

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