【问题标题】:How to create Temp table with SELECT * INTO tempTable FROM CTE Query如何使用 SELECT * INTO tempTable FROM CTE 查询创建临时表
【发布时间】:2012-07-14 12:42:12
【问题描述】:

我有一个 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 查询中创建一个临时表,我将不胜感激

【问题讨论】:

  • 这里是如何做到的stackoverflow.com/questions/3306096/…
  • @RGI,这两个答案都适用于我的情况,我给了他马丁,投票赞成,因为我只能选择一个答案。我很感激你的回答。正如您也提到临时查询的删除部分,我给出了您对他的回答偏好。为你的也投票..

标签: sql sql-server common-table-expression


【解决方案1】:

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) 

【讨论】:

    【解决方案2】:

    示例 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
    

    【讨论】:

    • 为什么是双周期?是不是打错字了?
    • .. 是省略指定架构。对于 ex tempdb.dbo.#temp。取而代之的是,我们可以输入 tempdb..#temp.
    • 这不能回答问题。 OP 专门询问如何使用 Select Into 执行此操作,而此响应并未这样做。这是一个很好的答案,但它不是正确的答案。
    【解决方案3】:

    确实,格式可以很简单 - 有时不需要预定义临时表 - 它将根据选择的结果创建。

    Select FieldA...FieldN 
    into #MyTempTable 
    from MyTable
    

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

    但是,无论如何,显式删除您创建的每个临时表通常被认为是一种良好的编码习惯。

    【讨论】:

    • 如果我不使用代码中的 drop table 删除临时表,执行后数据库中的临时表可以使用多长时间?因为我两次执行代码select * into #temp 但是,第二次执行时出现错误:“数据库中已存在表#temp”
    • @Kurapika 连接时长
    • 我们不需要在使用它之前显式创建表的事实是这个答案中最相关的事实。谢谢!
    【解决方案4】:

    如何在存储过程中使用临时表?

    步骤如下:

    创建临时表

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

    INSERT TEMP SELECT DATA INTO TEMP TABLE

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

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

    Select EmployeeID from #MyTempTable
    

    最后一步放下桌子

    Drop Table #MyTempTable
    

    我希望这会有所帮助。简单明了:)

    【讨论】:

    • 这不能回答问题。 OP 专门询问如何使用 Select Into 执行此操作,而此响应没有这样做。
    【解决方案5】:
    Select      Eventname, 
                count(Eventname) as 'Counts'
    INTO        #TEMPTABLE                                                                                
    FROM        tblevent
    where       Eventname like 'A%'
    Group by    Eventname
    order by    count(Eventname)
    

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

    【讨论】:

    • 这与现有答案有何不同?
    【解决方案6】:

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

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

    【讨论】:

    • 不知道为什么这不是公认的答案,但谢谢!
    【解决方案7】:

    您还可以使用 View 创建临时/虚拟表 创建视图 view_name AS 选择第 1 列,第 2 列,... FROM 表名 WHERE 条件;

    【讨论】:

    • 这是一个非常模糊的答案
    猜你喜欢
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2012-02-08
    • 2019-11-08
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多