2009-01-29 16 views
7

के साथ चयन करने के लिए कौन सी तालिका बदलना है मैं एक संग्रहीत प्रक्रिया लिखने की कोशिश कर रहा हूं और एक निश्चित कॉलम मान के आधार पर, मैं उस तालिका को बदलने में सक्षम होना चाहता हूं, जिसे मैं चुनता हूं। मैं एक उदाहरण देना करने की कोशिश करेंगे:गतिशील रूप से एसक्यूएल केस स्टेटमेंट

SELECT ItemNumber, 
     ItemType, 
     Description 
FROM 

CASE ItemType 
WHEN 'A' THEN TableA 
ELSE TableB 
END 

WHERE 

CASE ItemType 
WHEN 'A' THEN ItemNumber = @itemNumber 
ELSE PartNumber = @itemNumber 
END 

आप देख सकते हैं, न केवल मैं गतिशील तालिका मैं से चयन बदलते रहा हूँ, लेकिन इन दो तालिकाओं दो अलग-अलग लोगों द्वारा दो अलग अलग समय पर किए गए थे के बाद से, कॉलम नाम भी अलग हैं।

तो, मेरा सवाल है: इसे पूरा करने का सबसे अच्छा तरीका क्या है, क्योंकि SQL सर्वर मेरी क्वेरी को पसंद नहीं करता है।

हैं जो कोई क्या मैं यह करने के लिए एक बेहतर तरीका सुझाव है कि कर सकते हैं करने के लिए कोशिश कर रहा हूँ, मैं :-)

+0

जबकि लोग आमतौर पर "एसक्यूएल सर्वर" == "एमएस एसक्यूएल सर्वर" मानते हैं, तो बेहतर है कि आप इसे प्रश्न में और टैग में स्पष्ट करते हैं। मैं टैग बदल रहा हूं, अगर मैं गलत हूं तो वापस लौटाएं। –

+4

sqlserver माइक्रोसॉफ्ट एसक्यूएल सर्वर के लिए टैग है। वर्तमान में उस नाम से कोई अन्य उत्पाद नहीं है, और इसके लिए एसओ पर यह एकमात्र उपयोगी टैग है। –

उत्तर

5

आप FROM खंड में मामला कथन का उपयोग नहीं कर सकते, लेकिन आप इसके बजाय निम्न का उपयोग कर सकते हैं:

SELECT itemnumber, itemtype, description 
    FROM tablea 
WHERE itemnumber = @itemnumber AND itemtype = 'A' 
UNION ALL 
SELECT itemnumber, itemtype, description 
    FROM tableb 
WHERE partnumber = @itemnumber AND itemtype <> 'A' 
+0

मेरा मतलब क्लॉज – user34850

0

आप पहली बार तालिकाओं में शामिल होने के यूनिअन क्वेरी का उपयोग करने का बेहतर हैं सब कान होगी देखता है, और फिर चुनें।

इसके अलावा, आप टेबल में से किसी एक के लिए दृश्य बनाने पर विचार कर सकते हैं, इसलिए यह उन्हें नामित करते समय केवल कॉलम खींचता है, फिर यूनियन, और फिर यूनियन से चुनें।

या प्रत्येक क्वेरी से परिणाम संग्रहीत करने के लिए एक temp तालिका का उपयोग करें। एक मामले में अस्थायी तालिका के निर्माण रखो (स्यूडोकोड, परीक्षण नहीं):

CASE @itemType 
    WHEN 'A' 
     SELECT ACol1 AS Col1, ACol2 AS Col2 
     FROM TABLE_A 
     INTO #tempTable 
     WHERE ItemNumber = @itemNumber 
    ELSE 
     SELECT BCol1 AS Col1, BCol2 AS Col2 
     FROM TABLE_B 
     INTO #tempTable 
     WHERE PartNumber = @itemNumber 
END 

SELECT * FROM #tempTable 
3

आप एक स्ट्रिंग के रूप गतिशील एसक्यूएल बयान के निर्माण की कोशिश कर सकते हैं, और फिर स्ट्रिंग निष्पादित करने के लिए sp_executesql संग्रहीत प्रक्रिया बुला।

अधिक जानकारी और उदाहरणों के लिए here देखें।

+0

मुझे संदेह है कि गतिशील एसक्यूएल वास्तव में यहां जरूरी है जब तक कि स्कीमा और भी पैथोलॉजिकल न हो। –

+0

मैं सहमत हूं कि एसपी वास्तव में खराब डिजाइन है, लेकिन मुझे लगता है कि प्रस्तावित समस्या का यह सबसे आसान समाधान है। –

+0

मुझे नहीं लगता कि समस्या को यह निर्धारित करने के लिए पर्याप्त रूप से पर्याप्त निर्दिष्ट किया गया है कि इसे पहले मूल एसक्यूएल के साथ हल नहीं किया जा सकता है। डायनामिक एसक्यूएल सामान्य रूप से तब तक नहीं माना जाना चाहिए जब तक कि सामान्य एसक्यूएल में बाधा न हो, यह सही विकल्प है। –

1

आप वास्तव में यह नहीं समझा रहे हैं कि ItemType कहां से आ रहा है। जैसा कि सुझाव दिया गया है कि UNION लागू हो सकता है यदि आप केवल दो तालिकाओं को जोड़ रहे हैं।

यहाँ एक और संभावना है जो आपकी समस्या से संबंधित हो सकती है:

SELECT ItemNumber, 
     ItemType, 
     COALESCE(TableA.Description, TableB.Description) AS Description 
FROM Items 
LEFT JOIN TableA 
    ON Items.ItemType = 'A' 
    AND TableA.ItemNumber = Items.ItemNumber 
LEFT JOIN TableB 
    ON Items.ItemType <> 'A' 
    AND TableB.ItemNumber = Items.ItemNumber 
3

मैं नहीं कर रहा हूँ सुनिश्चित करें कि आप एक SQL कथन में चीजें क्यों करना चाहते हैं .. मैं एक SQL सर्वर व्यक्ति नहीं हूं, लेकिन ओरेकल संग्रहीत प्रक्रिया में आप कुछ

If itemtype = 'A' 
Then 
<statement for table A> 
Else 
<statement for Table B> 
End if 
जैसे कुछ लिख सकते हैं

ऐसा कुछ SQL सर्वर में भी काम करना चाहिए .. शायद कोई इस पर विस्तार कर सकता है?

+0

से था जो मैं भी करता हूं – HLGEM

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