SELECT * INTO tempTable FROM CTEクエリで一時テーブルを作成する方法


163

一時テーブルを作成する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/...
Luxspes

1
@RGI、両方の回答が私のケースで機能します。私は彼にマーティンを与えました。回答ありがとうございます。tempクエリの削除部分についても言及したので、私は彼よりも優先的に回答しました。あなたも..ためのアップに投票
ラーニング

回答:


238

サンプル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

6
なぜ二重期間なのか?それはタイプミスですか?
Mike Cole

18
..はスキーマの指定を省略します。ex tempdb.dbo。#tempの場合。その代わりに、tempdb ..#tempと入力できます。
サム

7
これは質問の答えにはなりません。OPは、Select Intoでそれを行う方法を具体的に尋ねましたが、この応答はそれを行いません。それは良い答えですが、正しい答えではありません。
DaveInAZ

165

実際には、フォーマットは非常に単純です。一時テーブルを事前に定義する必要がない場合もあります。これは、選択の結果から作成されます。

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

したがって、さまざまなタイプが必要な場合や、定義が非常に厳密でない限り、物事を単純にしてください。また、ストアドプロシージャの内部で作成された一時テーブルは、ストアドプロシージャの実行が完了すると自動的に削除されます。ストアドプロシージャAが一時テーブルを作成し、ストアドプロシージャBを呼び出す場合、BはAが作成した一時テーブルを使用できます。

ただし、一般に、作成したすべての一時テーブルを明示的に削除することをお勧めします。


4
コードのドロップテーブルを使用して一時テーブルを削除しない場合、実行後、データベースの一時テーブルはどのくらい利用できますか?私は二度のコードを実行するためにselect * into #temp:しかし、二回目の実行がエラーを届ける「テーブル#TEMPは、すでにデータベースに存在します」
クラピカ

6
@Kurapika接続の期間
ジョネソポリス2017年

7
テーブルを使用する前に明示的に作成する必要がないという事実は、この回答で最も関連性の高い事実です。ありがとう!
Alfabravo

24

SELECT ... INTOCTEから選択にする必要があります。

;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

ストアドプロシージャでTempTableを使用する方法

手順は次のとおりです。

一時テーブルを作成

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

TEMP SELECT DATAにTEMP SELECT DATAを挿入

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

これがお役に立てば幸いです。シンプルで明確:)


5
これは質問の答えにはなりません。OPは、Select Intoでそれを行う方法を具体的に尋ねましたが、この応答はそれを行いません。
DaveInAZ

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

ここでは、into句を使用してテーブルが直接作成されます


3
これは既存の回答とどう違うのですか?
zx8754 2018年

1

実行時にテーブルを作成するクエリの回答に対するわずかな変更を以下に示します(つまり、最初にテーブルを作成する必要はありません)。

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.