Jak utworzyć tabelę Temp za pomocą zapytania SELECT * INTO tempTable FROM CTE

164

Mam zapytanie CTE MS SQL, z którego chcę utworzyć tabelę tymczasową. Nie jestem pewien, jak to zrobić, ponieważ powoduje to Invalid Object namebłąd.

Poniżej znajduje się całe zapytanie w celach informacyjnych

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)

Byłbym wdzięczny za punkt we właściwym kierunku lub jeśli mogę utworzyć tymczasową tabelę z tego zapytania CTE

Uczenie się
źródło
Oto jak to zrobić stackoverflow.com/questions/3306096/…
Luxspes
1
@RGI, ​​Obie odpowiedzi będą działać w moim przypadku, dałem mu Martina, głos za pozytywny, ponieważ mogę wybrać tylko jedną odpowiedź. Doceniam twoją odpowiedź. Podałem twoją odpowiedź przed jego, ponieważ wspomniałeś również o usunięciu części tymczasowego zapytania. Głosuj w górę na również ...
Nauka

Odpowiedzi:

238

Przykładowy 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

Upewnij się, że tabela została usunięta po użyciu

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End
Balicanta
źródło
6
Dlaczego podwójny okres? Czy to pomyłka?
Mike Cole
18
.. ma pominąć określanie schematu. Dla ex tempdb.dbo. # Temp. Zamiast tego możemy wpisać tempdb .. # temp.
sam
7
To nie odpowiada na pytanie. OP specjalnie zapytał, jak to zrobić za pomocą Select Into, a ta odpowiedź tego nie robi. To dobra odpowiedź, ale nie jest to właściwa odpowiedź.
DaveInAZ
165

Naprawdę format może być dość prosty - czasami nie ma potrzeby wstępnego definiowania tabeli tymczasowej - zostanie utworzony z wyników selekcji.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Więc jeśli nie chcesz różnych typów lub nie masz bardzo ścisłej definicji, zachowaj prostotę. Należy również zauważyć, że każda tabela tymczasowa utworzona w procedurze składowanej jest automatycznie usuwana po zakończeniu wykonywania procedury składowanej. Jeśli procedura składowana A tworzy tabelę tymczasową i wywołuje procedurę składowaną B, wówczas B będzie mógł użyć tabeli tymczasowej utworzonej przez A.

Jednak ogólnie uważa się, że dobrą praktyką kodowania jest jawne usuwanie każdej utworzonej tabeli tymczasowej.

Rohit
źródło
4
Jak długo jest dostępna tymczasowa tabela w bazie danych po wykonaniu, jeśli nie usunę jej za pomocą drop table w moim kodzie? ponieważ dwukrotnie wykonuję kod, select * into #tempale za drugim razem wykonanie powoduje błąd: „Tabela #temp już istnieje w bazie danych” .
Kurapika
6
@Kurapika czas trwania połączenia
Jonesopolis
7
Fakt, że nie musimy jawnie tworzyć tabeli przed jej użyciem, JEST najważniejszym faktem w tej odpowiedzi. Dzięki!
Alfabravo
24

Potrzeba SELECT ... INTOmusi być wybrana z 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
źródło
24

Jak używać TempTable w procedurze składowanej?

Oto kroki:

UTWÓRZ TABELĘ TEMP

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

WSTAW DANE WYBORU TEMPERATURY DO TABELI TEMP

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

SELECT TEMP TABLE (Możesz teraz użyć tego zapytania wybierającego)

Select EmployeeID from #MyTempTable

KROK KOŃCOWY UPUŚĆ STÓŁ

Drop Table #MyTempTable

Mam nadzieję, że to pomoże. Proste i przejrzyste :)

Manjunath Bilwar
źródło
5
To nie odpowiada na pytanie. OP specjalnie zapytał, jak to zrobić za pomocą Select Into, a ta odpowiedź tego nie robi.
DaveInAZ
4
Select      Eventname, 
            count(Eventname) as 'Counts'
INTO        #TEMPTABLE                                                                                
FROM        tblevent
where       Eventname like 'A%'
Group by    Eventname
order by    count(Eventname)

Tutaj za pomocą klauzuli into tabela jest tworzona bezpośrednio

linette J Sebastian
źródło
3
Czym to się różni od istniejących odpowiedzi?
zx8754
1

Oto jedna niewielka zmiana w odpowiedziach zapytania, które tworzy tabelę po wykonaniu (tj. Nie musisz najpierw tworzyć tabeli):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
John Gilmer
źródło