Як створити таблицю Temp за допомогою SELECT * INTO tempTable ОТ CTE Query


164

У мене є запит 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, ​​Обидві відповіді працюватимуть у моєму випадку, я дав йому Мартіна, голосуючи, оскільки я можу вибрати лише одну відповідь. Я ціную вашу відповідь. Я віддав перевагу своїй відповіді над його, оскільки ви також згадали про видалення частини тимчасового запиту. Голосувати за свої також ..
Навчання

Відповіді:


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
Чому подвійний період? Це помилка друку?
Майк Коул

18
.. пропустити вказівку схеми. Для ex tempdb.dbo. # Temp. Замість цього ми можемо ввести tempdb .. # temp.
сам

7
Це не відповідає на запитання. ОП спеціально запитала, як це зробити з Select Into, і ця відповідь цього не робить. Це гарна відповідь, але це не правильна відповідь.
DaveInAZ

165

Дійсно формат може бути досить простим - іноді немає необхідності заздалегідь визначати темп-таблицю - вона буде створена з результатів вибору.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Тому, якщо ви не хочете різних типів або не є дуже суворими у визначенні, будьте простими. Зауважте також, що будь-яка тимчасова таблиця, створена всередині збереженої процедури, автоматично скидається, коли збережена процедура закінчується виконанням. Якщо збережена процедура A створює таблицю темпів та викликає збережену процедуру B, тоді B зможе використовувати тимчасову таблицю, яку створив A.

Однак, як правило, вважається хорошою практикою кодування явно відміняти кожну створену тимчасову таблицю.


4
Скільки часу доступна тимчасова таблиця в базі даних після виконання, якщо я не видаляю її за допомогою таблиці в моєму коді? тому що я двічі виконую код, select * into #tempале, вдруге виконання видає помилку: "Таблиця #temp вже існує в базі даних" .
Курапіка

6
@Kurapika тривалість з'єднання
Jonesopolis

7
Те, що нам не потрібно чітко створювати таблицю перед її використанням, є найважливішим фактом у цій відповіді. Дякую!
Альфабраво

24

В SELECT ... INTOпотреби бути в обраних від КТР.

;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 COMMON DATA
Insert Into #MyTempTable
Select EmployeeID from [EmployeeMaster] Where EmployeeID between 1 and 100

ВИБІРТЕ ТАБЛИЦЮ ТЕМПУ (тепер ви можете використовувати цей обраний запит)

Select EmployeeID from #MyTempTable

ЗАКЛЮЧНИЙ КРОК ЗРОБИТИ ТАБЛИЦЮ

Drop Table #MyTempTable

Сподіваюся, це допоможе. Просто і зрозуміло :)


5
Це не відповідає на запитання. ОП спеціально запитала, як це зробити з 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)

Тут, використовуючи клавішу into, безпосередньо створюється таблиця


3
Чим це відрізняється від існуючих відповідей?
zx8754

1

Ось незначна зміна відповідей запиту, який створює таблицю після її виконання (тобто, вам не потрібно створювати таблицю спочатку):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.