Cara membuat tabel Temp dengan SELECT * INTO tempTable FROM CTE Query

165

Saya memiliki kueri MS SQL CTE dari mana saya ingin membuat tabel sementara. Saya tidak yakin bagaimana melakukannya karena memberikan Invalid Object namekesalahan.

Di bawah ini adalah seluruh permintaan untuk referensi

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)

Saya akan menghargai titik di arah yang benar atau jika saya bisa membuat tabel sementara dari kueri CTE ini

Belajar
sumber
Berikut adalah cara melakukannya stackoverflow.com/questions/3306096/...
Luxspes
1
@ RGI, Kedua jawaban akan bekerja untuk kasus saya, saya memberinya Martin, suara karena saya hanya dapat memilih satu jawaban. Saya menghargai jawaban Anda. Saya memberikan preferensi jawaban Anda di atas jawabannya seperti yang Anda sebutkan bagian penghapusan kueri temp juga. Up-Vote untuk Anda juga ..
Belajar

Jawaban:

238

Contoh 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

Pastikan bahwa tabel dihapus setelah digunakan

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End
Balicanta
sumber
6
Mengapa periode ganda? Apakah itu salah cetak?
Mike Cole
18
The .. adalah untuk menghilangkan menentukan skema. Untuk ex tempdb.dbo. # Temp. Alih-alih itu kita bisa mengetik tempdb .. # temp.
sam
7
Ini tidak menjawab pertanyaan. OP secara khusus bertanya bagaimana melakukannya dengan Select Into, dan respons ini tidak melakukannya. Itu jawaban yang bagus, tapi itu bukan jawaban yang tepat.
DaveInAZ
167

Benar-benar formatnya bisa sangat sederhana - kadang-kadang tidak perlu menentukan sebelumnya tabel temp - itu akan dibuat dari hasil pilih.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Jadi, kecuali Anda menginginkan tipe yang berbeda atau sangat ketat pada definisi, jaga agar semuanya tetap sederhana. Perhatikan juga bahwa setiap tabel sementara yang dibuat di dalam prosedur tersimpan secara otomatis dibatalkan ketika prosedur tersimpan selesai dijalankan. Jika prosedur tersimpan A membuat tabel temp dan memanggil prosedur tersimpan B, maka B akan dapat menggunakan tabel sementara yang dibuat A.

Namun, umumnya dianggap praktik pengkodean yang baik untuk secara eksplisit menghapus setiap tabel sementara yang Anda buat.

Rohit
sumber
4
Berapa lama tabel sementara tersedia di basis data setelah eksekusi jika saya tidak menghapusnya menggunakan drop table dalam kode saya? karena saya dua kali mengeksekusi kode select * into #temptetapi, kedua kalinya eksekusi menghasilkan kesalahan: "Tabel #temp sudah ada dalam basis data" .
Kurapika
6
@Kurapika durasi koneksi
Jonesopolis
7
Fakta bahwa kita tidak perlu membuat tabel secara eksplisit sebelum menggunakannya adalah fakta yang paling relevan dalam jawaban ini. Terima kasih!
Alfabravo
24

The SELECT ... INTOkebutuhan untuk berada di pilih dari 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
sumber
24

Bagaimana Cara Menggunakan TempTable dalam Prosedur yang Disimpan?

Berikut langkah-langkahnya:

BUAT Tabel TEMP

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

Masukkan data TEMP SELECT ke dalam tabel TEMP

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

SELECT TEMP TABLE (Sekarang Anda dapat menggunakan kueri pemilihan ini)

Select EmployeeID from #MyTempTable

FINAL LANGKAH DROP MEJA

Drop Table #MyTempTable

Saya harap ini akan membantu. Sederhana dan Jelas :)

Manjunath Bilwar
sumber
5
Ini tidak menjawab pertanyaan. OP secara khusus bertanya bagaimana melakukannya dengan Select Into, dan respons ini tidak melakukannya.
DaveInAZ
4
Select      Eventname, 
            count(Eventname) as 'Counts'
INTO        #TEMPTABLE                                                                                
FROM        tblevent
where       Eventname like 'A%'
Group by    Eventname
order by    count(Eventname)

Di sini dengan menggunakan klausa ke dalam tabel langsung dibuat

linette J Sebastian
sumber
3
Bagaimana ini berbeda dari jawaban yang ada?
zx8754
1

Berikut ini sedikit perubahan pada jawaban kueri yang membuat tabel setelah eksekusi (yaitu Anda tidak harus membuat tabel terlebih dahulu):

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