2012-10-18 15 views
7

मैं कुछ प्रकार के संसाधन प्रबंधन प्रणाली लिख रहा हूं।टी-एसक्यूएल ऑर्डर एक शर्त के अनुसार

एक संसाधन परिभाषा का एक उदाहरण है। एक परिभाषा मेटाडेटा है, मूल रूप से इसमें गुण होते हैं।

यह सामान्य मेरी DB में है:

TypeDefinition 
id name 
=============== 
1  CPU 


PropertyDefinition 
id name  typeDefinitionId valueType 
================================================ 
1  frequency 1     int 
2  status  1     string 


TypeInstance 
id name  typeDefinitionId 
================================= 
1  CPU#1 1 
2  CPU#2 1 


PropertyInstanceValue 
id propertyDefinitionId typeInstanceId valueType intValue StringValue FloatValue 
======================================================================================== 
1 1      1    int   10 
2 2      1    string    Pending 
3 1      2    int   20 
4 2      2    string    Approved 

आवश्यकता:

आदेश में एक विशिष्ट गुण मान के अनुसार सभी संसाधनों।

उदाहरण के लिए: अपने संसाधनों को उनके स्थिति के अनुसार ऑर्डर करें -> मतलब CPU # 2 CPU # 1 से पहले दिखाई देगा क्योंकि "स्वीकृत" "लंबित" से पहले है।

अगर हम आवृत्ति के अनुसार ऑर्डर करने के लिए थे, सीपीयू # 1 क्योंकि 10 से पहले सीपीयू # 2 प्रदर्शित होने से पहले 20

तो मैं एक अलग कॉलम (intValue/stringValue के अनुसार हर बार सॉर्ट करने के लिए की जरूरत है/FloatValue/आदि), संपत्ति के मूल्य टाइप के आधार पर।

कोई सुझाव?

सीमा:

धुरी वर्तमान में एकमात्र विकल्प हम के बारे में सोचा है, लेकिन यह वास्तव में संभव नहीं है के बाद से डीबी बहुत बड़ा है और मैं क्वेरी की जरूरत है जितनी जल्दी संभव के रूप में किया जाना है।

धन्यवाद अग्रिम में एक बहुत,

मीकल।

+0

पोस्ट कोड आप अब तक है, और जाने हमें बताएं कि आप –

+0

फंस रहे हैं आप की तरह लग रहा एक [ईएवी] का एक विशेष रूप से बुरा रूप है (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model) सेटअप। आपके पास एक denormalization समस्या भी है, जो आपको काटने के लिए वापस आ सकती है (क्योंकि 'ValueType'' PropertyInstanceValue' में डुप्लिकेट की गई है)। आपको पिवट की आवश्यकता नहीं होगी (और यह लगातार _columns_ को आदेश देगा, वैसे भी?), यह कुछ भी नहीं किया जा सकता है लेकिन कुछ सहसंबंधित परिणाम तालिका, जब तक आप इसे एक कॉलम के लिए लिखते हैं। लेकिन क्या आप पूरी तरह से स्थिति के _alphabetic_ आदेश, या कुछ अन्य मानदंडों में रुचि रखते हैं? –

उत्तर

5

समस्या यह है कि आप गतिशील रूप से फिर क्वेरी का निर्माण इस order by संरचना का उपयोग नहीं करना चाहती है, तो:

order by case @orderby 
    when 'status' then status 
    when 'frequency' then frequency 
    end 
option (recompile) 

आप @orderby पैरामीटर पारित करेंगे। अंतिम recompileoption इंजन को पारित पैरामीटर के अनुसार एक नई योजना बनाने के लिए मजबूर करना है, मान लीजिए कि आप एक संग्रहीत प्रक्रिया का उपयोग कर रहे हैं।

+0

यह डायनेमिक एसक्यूएल का एक अच्छा विकल्प है जिसे मैं नहीं जानता था। +1 – Jim

0

यदि आप SQL का उपयोग करके अपने क्वेरी परिणामों को ऑर्डर करना चाहते हैं (परिणाम लौटने के बाद कॉलिंग एप्लिकेशन में उन्हें सॉर्ट करने के विपरीत) आपको गतिशील SQL उत्पन्न करना होगा और sp_executesql का उपयोग करके इसे निष्पादित करना होगा।

http://msdn.microsoft.com/en-us/library/ms188001.aspx

0

अगर मैं आपके सवाल का सही ढंग से समझ, मैं यह दृष्टिकोण देंगी:

  1. अनुमति स्ट्रिंग मानों की तालिका बनाएँ, पूर्वता छँटाई निर्दिष्ट करने के लिए एक कॉलम शामिल करना न भूलें (चलो कॉल यह आवंटित मूल्य)

    तालिका [डीबीओ] बनाएं।[AllowedStringValues] (PropertyDefinitionId int, stringValue varchar (250), sortOrder int)

  2. एक जटिल सबक्वायरी बनाएं जो पंक्ति की संपत्ति परिभाषा के आधार पर उचित मान का चयन करती है (ऐसा लगता है कि इसे डेटाटाइप के आधार पर 3 कॉलम के बीच देखना चाहिए यह है)।

  3. यदि मान कोई स्ट्रिंग प्रकार होती, भीतरी AllowedStringValues ​​तालिका साथ सबक्वेरी में शामिल होने के (यह मानते हुए मूल्य एक मूल्य के कॉलम में जमा हो गया था)

    भीतरी ValueType = स्ट्रिंग और मूल्य पर AllowedStringValues ​​में शामिल होने के = stringValue या ValueType <> स्ट्रिंग

  4. क्रमबद्ध AllowedValues ​​में तरह प्राथमिकता के आधार पर अगर यह एक स्ट्रिंग है, या अंक मान otherw द्वारा आईएसई।

    मामले से आदेश ValueType जब 'स्ट्रिंग' तो sortOrder किसी और मूल्य अंत

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