So erstellen Sie eine Temp-Tabelle mit SELECT * INTO tempTable FROM CTE Query


162

Ich habe eine MS SQL CTE-Abfrage, aus der ich eine temporäre Tabelle erstellen möchte. Ich bin nicht sicher, wie ich es machen soll, da es einen Invalid Object nameFehler gibt .

Unten finden Sie die gesamte Referenzabfrage

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)

Ich würde mich über einen Punkt in die richtige Richtung freuen oder darüber, ob ich aus dieser CTE-Abfrage eine temporäre Tabelle erstellen kann



1
@RGI, ​​beide Antworten werden für meinen Fall funktionieren, ich habe ihm Martin zur Abstimmung gegeben, da ich nur eine Antwort auswählen kann. Ich schätze deine Antwort. Ich gab Ihrer Antwort den Vorzug vor seiner, da Sie auch das Löschen eines Teils der temporären Abfrage erwähnt hatten. Up-Vote für Ihre auch ..
Lernen

Antworten:


237

Beispiel 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

Stellen Sie sicher, dass die Tabelle nach der Verwendung gelöscht wird

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End

6
Warum die doppelte Periode? Ist das ein Tippfehler?
Mike Cole

18
Das .. besteht darin, die Angabe des Schemas wegzulassen. Zum Beispiel tempdb.dbo. # Temp. Stattdessen können wir tempdb .. # temp eingeben.
Sam

7
Dies beantwortet die Frage nicht. Das OP fragte speziell, wie es mit Select Into gemacht werden soll, und diese Antwort macht das nicht. Es ist eine gute Antwort, aber nicht die richtige.
DaveInAZ

164

Das Format kann sehr einfach sein - manchmal muss keine temporäre Tabelle vordefiniert werden - es wird aus den Ergebnissen der Auswahl erstellt.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

Halten Sie die Dinge einfach, es sei denn, Sie möchten unterschiedliche Typen oder sind sehr streng in der Definition. Beachten Sie auch, dass alle temporären Tabellen, die in einer gespeicherten Prozedur erstellt wurden, automatisch gelöscht werden, wenn die Ausführung der gespeicherten Prozedur abgeschlossen ist. Wenn die gespeicherte Prozedur A eine temporäre Tabelle erstellt und die gespeicherte Prozedur B aufruft, kann B die von A erstellte temporäre Tabelle verwenden.

Es wird jedoch allgemein als gute Codierungspraxis angesehen, jede von Ihnen erstellte temporäre Tabelle explizit zu löschen.


4
Wie lange ist die temporäre Tabelle nach der Ausführung in der Datenbank verfügbar, wenn ich sie nicht mithilfe der Drop-Tabelle in meinem Code entferne? weil ich den Code zweimal ausführe, select * into #tempaber beim zweiten Mal die Ausführung einen Fehler liefert: "Die Tabelle #temp existiert bereits in der Datenbank" .
Kurapika

6
@ Kurapika die Dauer der Verbindung
Jonesopolis

7
Die Tatsache, dass wir die Tabelle nicht explizit erstellen müssen, bevor wir sie verwenden, ist die relevanteste Tatsache in dieser Antwort. Vielen Dank!
Alfabravo

24

Das SELECT ... INTOmuss in der Auswahl aus dem CTE sein.

;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

Wie verwende ich TempTable in gespeicherten Prozeduren?

Hier sind die Schritte:

TEMP-TABELLE ERSTELLEN

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

INSERT TEMP SELECT DATA IN TEMP TABLE

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

SELECT TEMP TABLE (Sie können jetzt diese Auswahlabfrage verwenden)

Select EmployeeID from #MyTempTable

SCHLUSS SCHRITT TROPFEN SIE DIE TABELLE

Drop Table #MyTempTable

Ich hoffe das wird helfen. Einfach und klar :)


5
Dies beantwortet die Frage nicht. Das OP fragte speziell, wie es mit Select Into gemacht werden soll, und diese Antwort macht das nicht.
DaveInAZ

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

Hier wird mit der into-Klausel die Tabelle direkt erstellt


3
Wie unterscheidet sich das von bestehenden Antworten?
zx8754

1

Hier ist eine geringfügige Änderung an den Antworten einer Abfrage, die die Tabelle bei der Ausführung erstellt (dh Sie müssen die Tabelle nicht zuerst erstellen):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.