SELECT * INTO tempTable FROM CTE Query를 사용하여 임시 테이블을 만드는 방법


164

임시 테이블을 만들려는 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, 두 가지 답변 모두 제 경우에 효과가 있습니다. 마틴에게 답변을 하나만 선택할 수 있기 때문에 투표를했습니다. 답변 감사합니다. 임시 쿼리의 삭제 부분을 언급 했으므로 대답보다 우선합니다. 당신의 또한 투표 ..
Learning

답변:


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
..은 스키마 지정을 생략하는 것입니다. 예 tempdb.dbo. # temp 대신 tempdb .. # temp를 입력 할 수 있습니다.
sam

7
이것은 질문에 대답하지 않습니다. OP는 Select Into를 사용하여 작업을 수행하는 방법을 구체적으로 요청했지만이 응답은 그렇지 않습니다. 좋은 답변이지만 정답은 아닙니다.
DaveInAZ

165

실제로 형식은 매우 간단 할 수 있습니다. 때로는 임시 테이블을 사전 정의 할 필요가 없습니다. 선택 결과에서 생성됩니다.

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

따라서 다른 유형을 원하거나 정의가 매우 엄격하지 않은 한 간단하게 유지하십시오. 또한 저장 프로 시저 내부에서 생성 된 임시 테이블은 저장 프로 시저 실행이 완료되면 자동으로 삭제됩니다. 스토어드 프로 시저 A가 임시 테이블을 작성하고 스토어드 프로 시저 B를 호출하면 B는 A가 작성한 임시 테이블을 사용할 수 있습니다.

그러나 일반적으로 생성하는 모든 임시 테이블을 명시 적으로 삭제하는 것이 일반적으로 좋은 코딩 관행으로 간주됩니다.


4
내 코드에서 테이블 삭제를 사용하여 테이블을 제거하지 않으면 실행 후 데이터베이스에서 임시 테이블을 얼마나 오래 사용할 수 있습니까? 코드를 두 번 실행 select * into #temp하지만 두 번째로 실행하면 오류가 발생합니다. "테이블 #temp가 이미 데이터베이스에 존재합니다 . "
Kurapika

6
@Kurapika 연결 시간
Jonesopolis

7
테이블을 사용하기 전에 명시 적으로 테이블을 작성할 필요가 없다는 사실은이 답변에서 가장 관련성이 높은 사실입니다. 감사!
Alfabravo

24

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) 

24

저장 프로 시저에서 TempTable을 사용하는 방법은 무엇입니까?

단계는 다음과 같습니다.

TEMP TABLE 생성

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

TEMP 테이블에 TEMP SELECT 데이터 삽입

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

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.