Как создать временную таблицу с SELECT * в tempTable из запроса CTE


у меня есть запрос 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

5 93

5 ответов:

образец 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

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

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

поэтому, если вы не хотите разные типы или очень строги по определению, держите вещи простыми. Обратите также внимание, что любая временная таблица, созданная внутри хранимой процедуры, автоматически удаляется после завершения выполнения хранимой процедуры. Если хранимая процедура создает временную таблицу и вызывает хранимую процедуру B, то B будет возможность использовать временную таблицу, которая была создана.

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

The 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) 

как использовать TempTable в хранимой процедуре?

вот шаги:

СОЗДАТЬ ВРЕМЕННУЮ ТАБЛИЦУ

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

ВСТАВИТЬ ДАННЫЕ TEMP SELECT В ТАБЛИЦУ TEMP

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

выберите временную таблицу (теперь вы можете использовать этот запрос select)

Select EmployeeID from #MyTempTable

ПОСЛЕДНИЙ ШАГ ПАДЕНИЕ ТАБЛИЦЫ

Drop Table #MyTempTable

Я надеюсь, что это поможет. Просто и понятно :)

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

здесь с помощью предложения into таблица создается непосредственно