如何使用SELECT*INTO tempTable FROM CTE Query创建Temp表

Lea*_*ing 127 sql sql-server common-table-expression

我有一个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)
Run Code Online (Sandbox Code Playgroud)

我希望在正确的方向上有一点,或者我是否可以从此CTE查询创建临时表

小智 211

样本DDL

create table #Temp
(
    EventID int, 
    EventTitle Varchar(50), 
    EventStartDate DateTime, 
    EventEndDate DatetIme, 
    EventEnumDays int,
    EventStartTime Datetime,
    EventEndTime DateTime, 
    EventRecurring Bit, 
    EventType int
)
Run Code Online (Sandbox Code Playgroud)
;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
Run Code Online (Sandbox Code Playgroud)

确保在使用后删除该表

If(OBJECT_ID('tempdb..#temp') Is Not Null)
Begin
    Drop Table #Temp
End
Run Code Online (Sandbox Code Playgroud)

  • ..是省略指定架构.对于ex tempdb.dbo.#temp.而不是我们可以输入tempdb ..#temp. (14认同)
  • 为什么双重期?那是一个错字吗? (5认同)
  • 这不回答这个问题.OP特别询问如何使用Select Into执行此操作,并且此响应不会这样做.这是一个很好的答案,但这不是正确的答案. (4认同)

小智 128

实际上格式可以非常简单 - 有时不需要预定义临时表 - 它将根据select的结果创建.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable
Run Code Online (Sandbox Code Playgroud)

因此,除非您需要不同的类型或对定义非常严格,否则请保持简单.另请注意,在存储过程完成执行时,将自动删除在存储过程中创建的任何临时表.如果存储过程A创建临时表并调用存储过程B,则B将能够使用A创建的临时表.

但是,通常认为良好的编码实践是显式删除您创建的每个临时表.

  • @Kurapika连接的持续时间 (5认同)
  • 在使用表之前,我们不需要显式创建表的事实是此答案中最相关的事实。谢谢! (3认同)
  • 如果我没有在我的代码中使用drop table删除它,那么执行后数据库中的临时表有多长?因为我两次执行代码`select*into#temp`但是,第二次执行会发出错误:_"表#temp已经存在于数据库中"_. (2认同)

Mar*_*ith 22

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) 
Run Code Online (Sandbox Code Playgroud)


小智 21

如何在存储过程中使用TempTable?

以下是步骤:

创建TEMP表

-- CREATE TEMP TABLE 
Create Table #MyTempTable (
    EmployeeID int
);
Run Code Online (Sandbox Code Playgroud)

将TEMP选择数据插入TEMP表

-- INSERT COMMON DATA
Insert Into #MyTempTable
Select EmployeeID from [EmployeeMaster] Where EmployeeID between 1 and 100
Run Code Online (Sandbox Code Playgroud)

SELECT TEMP TABLE(您现在可以使用此选择查询)

Select EmployeeID from #MyTempTable
Run Code Online (Sandbox Code Playgroud)

最后一步下降表

Drop Table #MyTempTable
Run Code Online (Sandbox Code Playgroud)

我希望这将有所帮助.简单明了:)

  • 这不回答这个问题.OP特别询问如何使用Select Into执行此操作,并且此响应不会这样做. (4认同)

小智 7

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

这里通过使用 into 子句直接创建表

  • 这与现有答案有何不同? (4认同)

Joh*_*mer 5

这是对在执行时创建表的查询的答案的一个轻微改动(即您不必先创建表):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
Run Code Online (Sandbox Code Playgroud)