Ik heb een MS SQL CTE-query waaruit ik een tijdelijke tabel wil maken. Ik weet niet zeker hoe ik dit moet doen, omdat het een Invalid Object name
-fout geeft.
Hieronder staat de hele zoekopdracht ter referentie
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)
Ik zou een punt in de goede richting waarderen of als ik een tijdelijke tabel kan maken van deze CTE-query
Antwoord 1, autoriteit 100%
Voorbeeld 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
Zorg ervoor dat de tabel na gebruik wordt verwijderd
If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
Drop Table #Temp
End
Antwoord 2, autoriteit 74%
Het formaat kan heel eenvoudig zijn – soms is het niet nodig om vooraf een tijdelijke tabel te definiëren – het wordt gemaakt op basis van de resultaten van de geselecteerde.
Select FieldA...FieldN
into #MyTempTable
from MyTable
Dus houd het simpel, tenzij je verschillende typen wilt of erg strikt bent in de definitie. Houd er ook rekening mee dat elke tijdelijke tabel die in een opgeslagen procedure is gemaakt, automatisch wordt verwijderd wanneer de opgeslagen procedure wordt uitgevoerd. Als opgeslagen procedure A een tijdelijke tabel maakt en opgeslagen procedure B aanroept, kan B de tijdelijke tabel gebruiken die A heeft gemaakt.
Het wordt echter over het algemeen als een goede codeerpraktijk beschouwd om elke tijdelijke tabel die u toch maakt, expliciet te verwijderen.
Antwoord 3, autoriteit 11%
De SELECT ... INTO
moet in de selectie van de CTE staan.
;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)
Antwoord 4, autoriteit 10%
Hoe TempTable gebruiken in opgeslagen procedure?
Dit zijn de stappen:
CREER TEMP TABEL
-- CREATE TEMP TABLE
Create Table #MyTempTable (
EmployeeID int
);
VOEG TEMP SELECT DATA IN IN TEMP TABEL
-- INSERT COMMON DATA
Insert Into #MyTempTable
Select EmployeeID from [EmployeeMaster] Where EmployeeID between 1 and 100
SELECTEER TEMP TABLE (U kunt nu deze selectiequery gebruiken)
Select EmployeeID from #MyTempTable
Laatste STAP DE TAFEL LATEN VALLEN
Drop Table #MyTempTable
Ik hoop dat dit zal helpen. Eenvoudig en duidelijk 🙂
Antwoord 5, autoriteit 3%
Select Eventname,
count(Eventname) as 'Counts'
INTO #TEMPTABLE
FROM tblevent
where Eventname like 'A%'
Group by Eventname
order by count(Eventname)
Hier door de into-clausule te gebruiken, wordt de tabel direct gemaakt
Antwoord 6, autoriteit 2%
Hier is een kleine wijziging in de antwoorden van een query die de tabel bij uitvoering maakt (u hoeft de tabel dus niet eerst te maken):
SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
Antwoord 7
U kunt View ook gebruiken om een tijdelijke/virtuele tabel te maken
CREATE VIEW view_name AS
SELECT kolom1, kolom2, …
FROM tabelnaam
WHERE voorwaarde;