Как создать временную таблицу с 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 ответов:
образец 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
Я надеюсь, что это поможет. Просто и понятно :)