วิธีการสร้างตาราง Temp พร้อม SELECT * INTO tempTable จาก CTE Query


165

ฉันมีคิวรี่ MS SQL CTE ซึ่งฉันต้องการสร้างตารางชั่วคราว ฉันไม่แน่ใจว่าจะทำอย่างไรเพราะจะทำให้เกิดInvalid Object nameข้อผิดพลาด

ด้านล่างนี้เป็นข้อความค้นหาทั้งหมดสำหรับการอ้างอิง

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)

ฉันจะขอบคุณจุดในทิศทางที่ถูกต้องหรือถ้าฉันสามารถสร้างตารางชั่วคราวจากแบบสอบถาม CTE นี้


นี่คือวิธีทำstackoverflow.com/questions/3306096//
Luxspes

1
@RGI คำตอบทั้งสองข้อจะใช้ได้กับกรณีของฉันฉันให้ Martin กับเขาเพราะฉันเลือกได้เพียงคำตอบเดียว ฉันขอขอบคุณคำตอบของคุณ ฉันให้คำตอบของคุณมากกว่าเขาในขณะที่คุณได้กล่าวถึงการลบบางส่วนของแบบสอบถามชั่วคราว โหวตให้กับคุณด้วย ..
เรียนรู้

คำตอบ:


238

ตัวอย่าง 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

ตรวจสอบให้แน่ใจว่าตารางถูกลบหลังการใช้งาน

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

6
ทำไมต้องเป็นคาบสองเท่า นั่นคือการพิมพ์ผิดหรือเปล่า?
Mike Cole

18
.. คือการละเว้นการระบุสคีมา สำหรับอดีต tempdb.dbo. # temp แทนที่จะเป็นเช่นนั้นเราสามารถพิมพ์ tempdb .. # temp
Sam

7
สิ่งนี้ไม่ตอบคำถาม OP ถามโดยเฉพาะว่าจะทำอย่างไรกับ Select Into และการตอบกลับนี้ไม่ได้ทำ มันเป็นคำตอบที่ดี แต่ไม่ใช่คำตอบที่ถูก
DaveInAZ

167

จริง ๆ แล้วรูปแบบนั้นค่อนข้างง่าย - บางครั้งไม่จำเป็นต้องกำหนดตารางชั่วคราว - มันจะถูกสร้างจากผลลัพธ์ของตัวเลือก

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

ดังนั้นหากคุณไม่ต้องการประเภทที่แตกต่างหรือเข้มงวดกับคำจำกัดความมากให้ทำสิ่งที่ง่าย โปรดทราบว่าตารางชั่วคราวใด ๆ ที่สร้างขึ้นภายในโพรซีเดอร์ที่เก็บไว้จะถูกดร็อปโดยอัตโนมัติเมื่อโพรซีเดอร์ที่เก็บไว้ดำเนินการเสร็จสิ้น หากโพรซีเดอร์ที่เก็บ A สร้างตารางชั่วคราวและเรียกโพรซีเดอร์ที่เก็บไว้ B ดังนั้น B จะสามารถใช้ตารางชั่วคราวที่สร้างขึ้น

อย่างไรก็ตามโดยทั่วไปถือว่าเป็นวิธีปฏิบัติที่ดีในการเขียนรหัสเพื่อวางตารางชั่วคราวทุกอันที่คุณสร้างไว้อย่างชัดเจน


4
นานแค่ไหนที่มีตารางชั่วคราวในฐานข้อมูลหลังจากการดำเนินการถ้าฉันไม่ลบมันโดยใช้ตารางการลดลงในรหัสของฉัน? เพราะผมเป็นครั้งที่สองรันรหัสselect * into #tempแต่ครั้งที่สองการดำเนินการส่งมอบข้อผิดพลาด: "การ #temp ตารางมีอยู่แล้วในฐานข้อมูล"
Kurapika

6
@Kurapika ระยะเวลาของการเชื่อมต่อ
Jonesopolis

7
ความจริงที่เราไม่จำเป็นต้องสร้างตารางอย่างชัดเจนก่อนที่จะใช้มันเป็นข้อเท็จจริงที่เกี่ยวข้องมากที่สุดในคำตอบนี้ ขอบคุณ!
Alfabravo

24

SELECT ... INTOความต้องการที่จะอยู่ในการเลือกจาก 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) 

24

วิธีใช้ TempTable ในกระบวนงานที่เก็บไว้

นี่คือขั้นตอน:

สร้างตารางเทมเพลต

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

INSERT TEMP SELECT ข้อมูลลงในตาราง TEMP

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

SELECT TEMP TABLE (ขณะนี้คุณสามารถใช้แบบสอบถามแบบใช้เลือกข้อมูลนี้)

Select EmployeeID from #MyTempTable

ขั้นตอนสุดท้ายวางตาราง

Drop Table #MyTempTable

ฉันหวังว่านี่จะช่วยได้ ง่ายและชัดเจน :)


5
สิ่งนี้ไม่ตอบคำถาม OP ถามโดยเฉพาะว่าจะทำอย่างไรกับ Select Into และการตอบกลับนี้ไม่ได้ทำ
DaveInAZ

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

ที่นี่โดยใช้คำสั่งลงในตารางจะถูกสร้างขึ้นโดยตรง


3
สิ่งนี้แตกต่างจากคำตอบที่มีอยู่หรือไม่
zx8754

1

ต่อไปนี้เป็นการเปลี่ยนแปลงเล็กน้อยสำหรับคำตอบของแบบสอบถามที่สร้างตารางเมื่อมีการดำเนินการ (เช่นคุณไม่จำเป็นต้องสร้างตารางก่อน):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.