Hoe een Temp-tabel te maken met SELECT * INTO tempTable FROM CTE Query

Ik heb een MS SQL CTE-query waaruit ik een tijdelijke tabel wil maken. Ik weet niet zeker hoe ik dit moet doen, omdat het een Invalid Object name-fout geeft.

Hieronder staat de hele zoekopdracht ter referentie

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)

Ik zou een punt in de goede richting waarderen of als ik een tijdelijke tabel kan maken van deze CTE-query


Antwoord 1, autoriteit 100%

Voorbeeld 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

Zorg ervoor dat de tabel na gebruik wordt verwijderd

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

Antwoord 2, autoriteit 74%

Het formaat kan heel eenvoudig zijn – soms is het niet nodig om vooraf een tijdelijke tabel te definiëren – het wordt gemaakt op basis van de resultaten van de geselecteerde.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Dus houd het simpel, tenzij je verschillende typen wilt of erg strikt bent in de definitie. Houd er ook rekening mee dat elke tijdelijke tabel die in een opgeslagen procedure is gemaakt, automatisch wordt verwijderd wanneer de opgeslagen procedure wordt uitgevoerd. Als opgeslagen procedure A een tijdelijke tabel maakt en opgeslagen procedure B aanroept, kan B de tijdelijke tabel gebruiken die A heeft gemaakt.

Het wordt echter over het algemeen als een goede codeerpraktijk beschouwd om elke tijdelijke tabel die u toch maakt, expliciet te verwijderen.


Antwoord 3, autoriteit 11%

De SELECT ... INTOmoet in de selectie van de CTE staan.

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

Antwoord 4, autoriteit 10%

Hoe TempTable gebruiken in opgeslagen procedure?

Dit zijn de stappen:

CREER TEMP TABEL

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

VOEG TEMP SELECT DATA IN IN TEMP TABEL

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

SELECTEER TEMP TABLE (U kunt nu deze selectiequery gebruiken)

Select EmployeeID from #MyTempTable

Laatste STAP DE TAFEL LATEN VALLEN

Drop Table #MyTempTable

Ik hoop dat dit zal helpen. Eenvoudig en duidelijk 🙂


Antwoord 5, autoriteit 3%

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

Hier door de into-clausule te gebruiken, wordt de tabel direct gemaakt


Antwoord 6, autoriteit 2%

Hier is een kleine wijziging in de antwoorden van een query die de tabel bij uitvoering maakt (u hoeft de tabel dus niet eerst te maken):

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

Antwoord 7

U kunt View ook gebruiken om een tijdelijke/virtuele tabel te maken
CREATE VIEW view_name AS
SELECT kolom1, kolom2, …
FROM tabelnaam
WHERE voorwaarde;

Other episodes