Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用SELECT*从CTE查询创建临时表_Sql_Sql Server_Common Table Expression - Fatal编程技术网

Sql 如何使用SELECT*从CTE查询创建临时表

Sql 如何使用SELECT*从CTE查询创建临时表,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我有一个MS SQL CTE查询,我想从中创建一个临时表。我不知道怎么做,因为它给出了一个无效的对象名错误 下面是整个查询供参考 SELECT * INTO TEMPBLOCKEDDATES FROM ;with Calendar as ( select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays,EventStartTime,EventEndTime, EventRecurring, EventSt

我有一个MS SQL CTE查询,我想从中创建一个临时表。我不知道怎么做,因为它给出了一个无效的对象名错误

下面是整个查询供参考

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查询中创建一个临时表,或者选择正确的方向,我将不胜感激。。。进入需要在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) 
样本DDL 确保该表在使用后被删除

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

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

Select FieldA...FieldN 
into #MyTempTable 
from MyTable
所以,除非你想要不同的类型,或者定义非常严格,否则要保持简单。还要注意,当存储过程完成执行时,在存储过程中创建的任何临时表都会自动删除。如果存储过程A创建临时表并调用存储过程B,则B将能够使用A创建的临时表


然而,通常认为最好的编码实践是显式删除您创建的每个临时表。

如何在存储过程中使用诱惑

以下是步骤:

创建临时表

-- CREATE TEMP TABLE 
Create Table #MyTempTable (
    EmployeeID int
);
-- INSERT COMMON DATA
Insert Into #MyTempTable
Select EmployeeID from [EmployeeMaster] Where EmployeeID between 1 and 100
将临时选择数据插入临时表

-- 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 EmployeeID from #MyTempTable
最后一步放下桌子

Drop Table #MyTempTable
我希望这会有所帮助。简单明了:

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

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

这里对执行时创建表的查询的答案做了一个小小的修改,即不必先创建表:

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

还可以使用视图创建临时/虚拟表 创建视图名称为 选择第1列、第2列。。。 从表\u名称
何处条件

这里是如何做到这一点@RGI,两个答案都适用于我的情况,我给他马丁,向上投票,因为我只能选择一个答案。谢谢你的回答。我给你的答案优先于他的,因为你也提到了临时查询的删除部分。投你的一票…为什么是双周期?那是打字错误吗。。是指省略对架构的指定。对于ex tempdb.dbo.temp。相反,我们可以键入tempdb..temp。这不能回答问题。OP特别询问了如何使用Select Into执行此操作,而此响应没有这样做。这是一个很好的答案,但不是正确的答案。如果我在代码中不使用drop table删除临时表,那么执行后数据库中的临时表有多长时间可用?因为我两次执行代码select*into temp,但第二次执行时出现错误:数据库中已经存在表temp。@Kurapika连接的持续时间事实上,我们不需要在使用表之前显式创建表,这是这个答案中最相关的事实。谢谢这并不能回答问题。OP特别询问了如何使用Select Into,而这个回答并没有这样做。这与现有答案有什么不同?这是一个非常模糊的答案