Cách tạo bảng Temp với CHỌN * VÀO tempTable TỪ Truy vấn CTE


163

Tôi có một truy vấn CTE MS SQL mà tôi muốn tạo một bảng tạm thời. Tôi không chắc chắn làm thế nào để làm điều đó vì nó gây ra Invalid Object namelỗi.

Dưới đây là toàn bộ truy vấn để tham khảo

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)

Tôi sẽ đánh giá cao một điểm theo đúng hướng hoặc nếu tôi có thể tạo một bảng tạm thời từ truy vấn CTE này


Dưới đây là cách thực hiện stackoverflow.com/questions/3306096/
mẹo

1
@RGI, ​​Cả hai câu trả lời sẽ hoạt động cho trường hợp của tôi, tôi đã đưa cho anh ấy Martin, bỏ phiếu vì tôi chỉ có thể chọn một câu trả lời. Tôi đánh giá cao câu trả lời của bạn. Tôi đã đưa ra ưu tiên câu trả lời của bạn cho anh ấy như bạn đã đề cập đến việc xóa một phần của truy vấn tạm thời. Up-Vote cho bạn cũng ..
Học

Câu trả lời:


238

Mẫu 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

Đảm bảo rằng bảng đã bị xóa sau khi sử dụng

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

6
Tại sao thời kỳ kép? Đó có phải là một lỗi đánh máy?
Mike Cole

18
.. là bỏ qua chỉ định lược đồ. Đối với ex tempdb.dbo. # Temp. Thay vào đó, chúng ta có thể gõ tempdb .. # temp.
sam

7
Điều này không trả lời câu hỏi. OP đặc biệt hỏi cách thực hiện với Chọn vào và phản hồi này không làm điều đó. Đó là một câu trả lời tốt, nhưng nó không phải là câu trả lời đúng.
DaveInAZ

165

Thực sự định dạng có thể khá đơn giản - đôi khi không cần xác định trước bảng tạm thời - nó sẽ được tạo từ kết quả của lựa chọn.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Vì vậy, trừ khi bạn muốn các loại khác nhau hoặc rất nghiêm ngặt về định nghĩa, hãy giữ mọi thứ đơn giản. Cũng lưu ý rằng bất kỳ bảng tạm thời nào được tạo bên trong một thủ tục được lưu trữ sẽ tự động bị hủy khi thủ tục được lưu trữ kết thúc thực thi. Nếu thủ tục được lưu trữ A tạo bảng tạm thời và gọi thủ tục được lưu trữ B, thì B sẽ có thể sử dụng bảng tạm thời mà A đã tạo.

Tuy nhiên, nó thường được coi là thực hành mã hóa tốt để loại bỏ rõ ràng mọi bảng tạm thời bạn tạo.


4
Bảng tạm thời có sẵn trong cơ sở dữ liệu sau bao lâu nếu tôi không xóa bảng bằng cách sử dụng bảng thả trong mã của mình? bởi vì tôi hai lần thực thi mã select * into #tempnhưng lần thứ hai thực thi sẽ phát sinh lỗi: "Bảng #temp đã tồn tại trong cơ sở dữ liệu" .
Kurapika

6
@Kurapika thời lượng của kết nối
Jonesopolis

7
Thực tế chúng ta không cần phải tạo bảng một cách rõ ràng trước khi sử dụng nó là thực tế có liên quan nhất trong câu trả lời này. Cảm ơn!
Alfabravo

24

Sự SELECT ... INTOcần thiết phải được chọn từ 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

Làm thế nào để sử dụng TempTable trong thủ tục lưu trữ?

Dưới đây là các bước:

TẠO BẢNG TEMP

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

CHỌN TEMP CHỌN DỮ LIỆU VÀO BẢNG TEMP

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

BẢNG CHỌN TEMP (Bây giờ bạn có thể sử dụng truy vấn chọn này)

Select EmployeeID from #MyTempTable

BƯỚC CUỐI CÙNG DROP BẢNG

Drop Table #MyTempTable

Hy vọng điều này có thể giúp cho bạn. Đơn giản và rõ ràng :)


5
Điều này không trả lời câu hỏi. OP đặc biệt hỏi cách thực hiện với Chọn vào và phản hồi này không làm điều đó.
DaveInAZ

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

Ở đây bằng cách sử dụng mệnh đề thành, bảng được tạo trực tiếp


3
Điều này khác với câu trả lời hiện có như thế nào?
zx8754

1

Đây là một thay đổi nhỏ đối với các câu trả lời của truy vấn tạo bảng khi thực hiện (nghĩa là bạn không phải tạo bảng trước):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.