2013-05-09 7 views
10

निर्धारित करने के लिए IF/ELSE का उपयोग करके कुछ अजीब समस्याएं हैं, यह निर्धारित करने के लिए कि कौन से एक या दो चयन कथन निष्पादित करने के लिए हैं। पूर्ण कथन चलाते समय मुझे जो त्रुटि संदेश मिल रहा है वह यह है कि मेरी अस्थायी तालिका पहले से मौजूद है, लेकिन ऐसा नहीं होता है यदि मैं दो अलग-अलग IF कथनों के दो अलग-अलग निष्पादन चलाता हूं।IF/ELSE का उपयोग एक चयन INTO कथन

IF (select BusinessDayCount from Calendartbl) <= 1 
    BEGIN 
    SELECT * into #temp1 
    FROM PreviousMonthTbl 
    END 
ELSE 
    BEGIN 
    SELECT * into #temp1 
    FROM CurrentMonthTbl 
    END 
+0

के लिए एक अलग नाम का उपयोग करें, आपको इस प्रश्न में SQL सर्वर या T-SQL टैग जोड़ना चाहिए। मुझे लगता है कि आपको बेहतर/अधिक प्रतिक्रिया मिल जाएगी। –

+0

पिछला महीना और CurrentMonth एक ही संरचना है? –

+0

वर्तमान और पिछले महीने में एक ही संरचना होनी चाहिए। मैंने इसे इस मुद्दे को दिखाने के लिए यहां सरलीकृत किया है, लेकिन वे दोनों एक ही तालिका के सबक्वायरीज़ का प्रतिनिधित्व करते हैं, क्योंकि पिछले के लिए मैं तालिका के लिए एक न्यूनतम (तारीख) कर रहा हूं और इसमें शामिल हो रहा हूं, वर्तमान में मैं अधिकतम (दिनांक) कर रहा हूं मेज और वापस इसमें शामिल हो रहा है। यह एक सारणी है जो इस महीने और पिछले महीने से डेटा रखती है, [दिनांक] यहां डेटा की प्रत्येक पंक्ति के अनुरूप महीने का प्रतिनिधित्व करती है। – user2367409

उत्तर

11

यह एक वाक्य रचना एसक्यूएल सर्वर में जाँच की "सुविधा" है:

यहाँ एसक्यूएल सर्वर में कोड है। आप एक ही बैच के भीतर दो बार # समकालीन तालिका "बना" नहीं सकते हैं।

यह वह पैटर्न है जिसकी आपको आवश्यकता है।

SELECT * into #temp1 
FROM PreviousMonthTbl 
WHERE 1=0; 

IF (select BusinessDayCount from Calendartbl) <= 1 
    BEGIN 
    INSERT into #temp1 SELECT * 
    FROM PreviousMonthTbl 
    END 
ELSE 
    BEGIN 
    INSERT into #temp1 SELECT * 
    FROM CurrentMonthTbl 
    END 

आप चाहें तो आप भी एक कहां खंड के रूप में शाखा (इस मामले में) को व्यक्त कर सकते हैं:

SELECT * into #temp1 
FROM PreviousMonthTbl 
WHERE (select BusinessDayCount from Calendartbl) <= 1 
UNION ALL 
SELECT * 
FROM CurrentMonthTbl 
WHERE isnull((select BusinessDayCount from Calendartbl),2) > 1 
+0

आह, मैं देखता हूं। यह चाहता है कि तालिका पहले से मौजूद हो और बस अपडेट हो। सहायता के लिए धन्यवाद! – user2367409

+0

समस्या यह है कि SQL सर्वर यह निर्धारित नहीं करता है कि दो "निर्माण" एक आईएफ की विभिन्न शाखाओं में हैं (और फिर भी आप वास्तव में 'लेबल' का उपयोग कर सकते हैं, वास्तव में दोनों को चलाने के लिए!)। इसलिए यह निष्कर्ष निकाला है कि आप इसे दो बार बनाने और शिकायत करने की कोशिश कर रहे हैं। उपरोक्त दोनों समाधान इस मुद्दे के आसपास आते हैं। – RichardTheKiwi

+0

यदि आप पहला दृष्टिकोण चुनते हैं, तो आपको एक तालिका बनाएं # temp1 कथन की आवश्यकता होगी। – fbhdev

0

मैं क्या समझ समस्या यह है से:

जब आप चलाने नीचे दिया गया कथन,

SELECT * into #temp1 FROM CurrentMonthTbl 

आप फ्लाई पर एक temp तालिका बना रहे हैं।

यदि उस पंक्ति से पहले आपके पास एक टेबल टेबल स्टेटमेंट था, तो यह कथन में चयन विफल हो जाएगा क्योंकि तालिका पहले से मौजूद है।

आपके मामले में आप पहले से ही बनाई गई एक अस्थायी तालिका है, तो जगह की कोशिश:

SELECT * into #temp1 FROM CurrentMonthTbl 

साथ:

Insert into #temp1 
    Select * from CurrentMonthTbl 

इसके अलावा There is already an object named '##Temp' in the database

+0

इसे देखकर, नीचे दिया गया उत्तर सही है, विशेष रूप से इस टिप्पणी के बारे में टिप्पणी कि SQL सर्वर एक ही नाम के साथ दो तालिकाओं को कैसे देखता है, इस तथ्य को अनदेखा कर रहा है कि जिन शर्तों के तहत टेबल बनाए जाते हैं पारस्परिक रूप से अनन्य हैं। – fbhdev

1

को देखो आप चयन उपयोग नहीं कर सकते एक ही बैच में एक ही नाम के साथ एक टेबल के लिए INTO। अस्थायी तालिका

IF EXISTS(
      SELECT 1  
      FROM Calendartbl 
      WHERE BusinessDayCount <= 1 
     ) 
BEGIN 
    IF OBJECT_ID('tempdb.dbo.#PreviousMonthTbl') IS NULL DROP TABLE dbo.#PreviousMonthTbl 
    SELECT * 
    INTO #PreviousMonthTbl 
    FROM PreviousMonthTbl 
END 
ELSE 
BEGIN 
    IF OBJECT_ID('tempdb.dbo.#CurrentMonthTbl') IS NULL DROP TABLE dbo.#CurrentMonthTbl 
    SELECT * 
    INTO #CurrentMonthTbl 
    FROM CurrentMonthTbl 
END 
+0

क्षमा करें, यह काम नहीं कर रहा है :( –

संबंधित मुद्दे