CTE Sorgusu'ndan SELECT * INTO tempTable ile Temp tablosu nasıl oluşturulur


165

Geçici bir tablo oluşturmak istediğim bir MS SQL CTE sorgusu var. Bir Invalid Object namehata verir gibi nasıl yapılacağından emin değilim .

Aşağıda referans için tüm sorgu

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)

Doğru yönde bir noktayı takdir ediyorum veya bu CTE sorgusundan geçici bir tablo oluşturabilirsem


İşte bunu nasıl yapacağınız stackoverflow.com/questions/3306096/…
Luxspes

1
@RGI, ​​Her iki yanıt da benim durumum için işe yarayacak, ona Martin'i verdim, sadece bir cevap seçebildiğim için oy verdim. Cevabınızı takdir ediyorum. Geçici sorgunun silinme kısmını da belirtmiş olduğunuz gibi cevap tercihinizi onun üzerine verdim. Sizin için de oy verin ..
Öğrenme

Yanıtlar:


238

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

Kullandıktan sonra tablonun silindiğinden emin olun

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

6
Neden çifte dönem? Bu bir yazım hatası mı?
Mike Cole

18
.. şemayı belirtmeyi atlamaktır. Eski tempdb.dbo için. # Temp. Bunun yerine tempdb .. # temp yazabiliriz.
sam

7
Bu soruya cevap vermiyor. OP, Select Into ile nasıl yapılacağını sordu ve bu yanıt bunu yapmıyor. Bu iyi bir cevap, ama doğru cevap değil.
DaveInAZ

167

Gerçekten format oldukça basit olabilir - bazen geçici bir tabloyu önceden tanımlamaya gerek yoktur - seçim sonuçlarından oluşturulacaktır.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Farklı türler istemiyorsanız veya tanım konusunda çok sıkı değilseniz, işleri basit tutun. Saklı yordamın içinde oluşturulan geçici tabloların saklı yordamın yürütülmesi tamamlandığında otomatik olarak bırakıldığını da unutmayın. Saklı yordam A geçici tablo oluşturur ve saklı yordam B'yi çağırırsa, B, A'nın oluşturduğu geçici tabloyu kullanabilecektir.

Ancak, zaten oluşturduğunuz her geçici tabloyu açıkça düşürmek genellikle iyi kodlama uygulaması olarak kabul edilir.


4
Kodumdaki bırakma tablosunu kullanarak kaldırmazsam yürütüldükten sonra veri tabanındaki geçici tablo ne kadar süre kullanılabilir? çünkü i kodu iki kez yürütür, select * into #tempancak ikinci kez yürütme bir hata verir: "#temp tablosu veri tabanında zaten var" .
Kurapika

6
@Kurapika bağlantı süresi
Jonesopolis

7
Tabloyu kullanmadan önce açıkça oluşturmamız gerekmiyor olması, bu cevaptaki en ilgili gerçektir. Teşekkürler!
Alfabravo

24

SELECT ... INTOİhtiyaçlar CTE seçin olmak.

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

24

Saklı Yordamda TempTable Nasıl Kullanılır?

İşte adımlar:

SICAKLIK TABLOSU OLUŞTUR

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

SICAKLIK SEÇİM VERİLERİNİ SICAKLIK TABLOSUNA TAKIN

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

SICAKLIK TABLOSU SEÇ (Artık bu seçme sorgusunu kullanabilirsiniz)

Select EmployeeID from #MyTempTable

NİHAİ ADIM TABLOSU DAMLA

Drop Table #MyTempTable

Umarım bu yardımcı olacak. Basit ve Açık :)


5
Bu soruya cevap vermiyor. OP, Select Into ile nasıl yapılacağını sordu ve bu yanıt bunu yapmıyor.
DaveInAZ

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

Burada into cümlesi kullanılarak tablo doğrudan oluşturulur


3
Bunun mevcut cevaplardan farkı nedir?
zx8754

1

Aşağıda, yürütme sırasında tabloyu oluşturan bir sorgunun yanıtlarında ufak bir değişiklik yapılmıştır (yani, önce tabloyu oluşturmanız gerekmez):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.