CTE क्वेरी से सेलेक्ट * INTO टेम्परेबल से टेम्प टेबल कैसे बनाएं


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)

मैं सही दिशा में एक बिंदु की सराहना करता हूं या यदि मैं इस सीटीई क्वेरी से एक अस्थायी तालिका बना सकता हूं


यहाँ यह कैसे करना है stackoverflow.com/questions/3306096/…
Luxspes

1
@RGI, ​​दोनों उत्तर मेरे मामले के लिए काम करेंगे, मैंने उन्हें मार्टिन दिया, क्योंकि मैं केवल एक उत्तर चुन सकता हूं। मैं आपके उत्तर की सराहना करता हूं। जैसा कि आपने अस्थायी क्वेरी के विलोपन भाग का भी उल्लेख किया था, मैंने आपके उत्तर को अपनी प्राथमिकता दी। अप-वोट फॉर
लर्निंग

जवाबों:


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
दोहरी अवधि क्यों? क्या वह टाइपो है?
माइक कोल

18
The .. स्कीमा को निर्दिष्ट करने के लिए छोड़ना है। पूर्व tempdb.dbo के लिए। # अस्थायी। इसके बजाय हम tempdb .. # temp टाइप कर सकते हैं।
सैम

7
इस सवाल का जवाब नहीं है। ओपी ने विशेष रूप से यह पूछा कि इसे सिलेक्ट इनटू के साथ कैसे किया जाए, और यह प्रतिक्रिया ऐसा नहीं करती है। यह एक अच्छा जवाब है, लेकिन यह सही जवाब नहीं है।
दवेइनाज

165

वास्तव में प्रारूप काफी सरल हो सकता है - कभी-कभी एक अस्थायी तालिका को पूर्वनिर्धारित करने की कोई आवश्यकता नहीं है - यह चयन के परिणामों से बनाया जाएगा।

Select FieldA...FieldN 
into #MyTempTable 
from MyTable

इसलिए जब तक आप विभिन्न प्रकार चाहते हैं या परिभाषा पर बहुत सख्त हैं, चीजों को सरल रखें। यह भी ध्यान दें कि संग्रहीत प्रक्रिया के अंदर बनाई गई कोई भी अस्थायी तालिका स्वचालित रूप से हटा दी जाती है जब संग्रहीत कार्यविधि निष्पादित होती है। यदि संग्रहीत कार्यविधि A एक अस्थायी तालिका बनाता है और संग्रहीत कार्यविधि B को कॉल करता है, तो B अस्थायी तालिका का उपयोग करने में सक्षम हो जाएगा जिसे A ने बनाया है।

हालाँकि, यह आमतौर पर अच्छा कोडिंग अभ्यास माना जाता है, ताकि आप जो भी अस्थायी तालिका बनाते हैं, उसे स्पष्ट रूप से छोड़ सकें।


4
निष्पादन के बाद डेटा बेस में अस्थायी तालिका कब तक उपलब्ध है यदि मैं अपने कोड में ड्रॉप टेबल का उपयोग करके इसे नहीं हटाता हूं? क्योंकि मैं दो बार कोड निष्पादित करता हूं select * into #tempलेकिन, दूसरी बार निष्पादन एक त्रुटि प्रदान करता है: "तालिका #temp पहले से ही डेटा बेस में मौजूद है"
कुरापिका

6
@ कुरुपिका कनेक्शन की अवधि
जोन्सोपोलिस

7
तथ्य का उपयोग करने से पहले हमें स्पष्ट रूप से तालिका बनाने की आवश्यकता नहीं है, इस उत्तर में सबसे अधिक प्रासंगिक तथ्य है। धन्यवाद!
अल्फ्रावो

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

संग्रहीत प्रक्रिया में अस्थायी उपयोग कैसे करें?

यहाँ कदम हैं:

TEMP टेबल बनाएँ

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

INSERT TEMP का चयन DATA INTO TEMP टेबल में होता है

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

SELEM TEMP TABLE (अब आप इस चुनिंदा क्वेरी का उपयोग कर सकते हैं)

Select EmployeeID from #MyTempTable

अंतिम चरण तालिका को गिराएं

Drop Table #MyTempTable

मुझे उम्मीद है कि इससे सहायता मिलेगी। सरल और स्पष्ट :)


5
इस सवाल का जवाब नहीं है। ओपी ने विशेष रूप से यह पूछा कि इसे सिलेक्ट इनटू के साथ कैसे किया जाए, और यह प्रतिक्रिया ऐसा नहीं करती है।
डेविन्ज

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

यहाँ खण्ड का उपयोग करके तालिका को सीधे बनाया गया है


3
यह मौजूदा उत्तरों से कैसे भिन्न है?
zx8754

1

यहाँ एक क्वेरी के उत्तर में थोड़ा सा बदलाव है जो निष्पादन पर तालिका बनाता है (यानी आपको पहले तालिका बनाने की आवश्यकता नहीं है):

SELECT * INTO #Temp
FROM (
select OptionNo, OptionName from Options where OptionActive = 1
) as X
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.