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

Ответы:

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
Balicanta
источник
6
Почему двойной период? Это опечатка?
Майк Коул
18
.. должен опустить указание схемы. Например, tempdb.dbo. # Temp. Вместо этого мы можем ввести tempdb .. # temp.
Сэм
7
Это не отвечает на вопрос. ОП специально спросил, как это сделать с помощью Select Into, и этот ответ этого не делает. Это хороший ответ, но это не правильный ответ.
DaveInAZ
167

На самом деле формат может быть довольно простым - иногда нет необходимости предварительно задавать временную таблицу - она ​​будет создана из результатов выбора.

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 TEMP TABLE (Теперь вы можете использовать этот запрос выбора)

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 создается таблица

Линетт J Себастьян
источник
3
Чем это отличается от существующих ответов?
zx8754
1

Вот одно небольшое изменение в ответах на запрос, который создает таблицу при выполнении (т.е. вам не нужно сначала создавать таблицу):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
Джон Гилмер
источник