SQL Server 如何使用SELECT * INTO tempTable FROM CTE查询创建临时表

vnjpjtjt  于 2022-11-21  发布在  其他
关注(0)|答案(8)|浏览(191)

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

h5qlskok

h5qlskok1#

样本DDL

第一个
确保使用后删除该表

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

41zrol4v2#

实际上,格式可以非常简单-有时不需要预定义临时表-它将从选择的结果中创建。

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

因此,除非您需要不同的类型或对定义要求非常严格,否则请保持简单。还要注意,在存储过程中创建的任何临时表在存储过程完成执行时都将自动删除。如果存储过程A创建临时表并调用存储过程B,则B将能够使用A创建的临时表。
但是,通常认为显式删除所创建的每个临时表是一种良好的编码实践。

rryofs0p

rryofs0p3#

如何 在 存储 过程 中 使用 TempTable ?
步骤 如下 :
创建 临时 表

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

中 的 每 一 个
将 临时 选择 数据 插入 临时 表

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

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

Select EmployeeID from #MyTempTable

格式
最 后 一 步 放下 table

Drop Table #MyTempTable

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

a6b3iqyw

a6b3iqyw4#

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)
ldxq2e6h

ldxq2e6h5#

下面是对执行时创建表的查询的回答的一个小修改(即,您不必首先创建表):

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

lyr7nygr6#

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

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

am46iovg

am46iovg7#

您还应该注意到存在GLOBAL临时表。这些临时表可以从另一个连接引用。它们的行为与前面的答案描述的非常相似。要创建一个临时表,只需在表名前加上前缀##。这就是我要找的;希望其他登陆这里的人也能发现这一点。

e5nszbig

e5nszbig8#

也 可以 使用 View 创建 临时/虚拟 表 CREATE VIEW view _ name AS SELECT column1 , column2 , ... FROM table _ name WHERE 条件 ;

相关问题