SQLCLR UDT का उपयोग करें। यह काम कर सकता है, हालांकि यह स्पष्ट नहीं है कि यह ऊपर वर्णित दृष्टिकोण की तुलना में शुद्ध लाभ प्राप्त करता है।
हाँ, SQLCLR UDT के कस्टम एल्गोरिदम के साथ इसके तुलनात्मक ऑपरेटर ओवरराइड हो सकते हैं। यह उन स्थितियों को संभालता है, जहां मूल्य की तुलना किसी अन्य मूल्य से की जा रही है, जो पहले से ही एक ही कस्टम प्रकार है, या एक जिसे परिवर्तित करने की आवश्यकता है। यह एक हालत में रेंज फिल्टर को संभालना चाहिएWHERE
।
UDT को एक नियमित कॉलम प्रकार (एक संगणित कॉलम नहीं) के रूप में क्रमबद्ध करने के संबंध में, यह केवल तभी संभव है जब UDT "बाइट ऑर्डर किया गया" हो। "बाइट ऑर्डर" होने का मतलब है कि यूडीटी का द्विआधारी प्रतिनिधित्व (जिसे यूडीटी में परिभाषित किया जा सकता है) स्वाभाविक रूप से उचित क्रम में सॉर्ट करता है। यह मानते हुए कि द्विआधारी प्रतिनिधित्व को VARCHAR (50) स्तंभ के लिए ऊपर वर्णित दृष्टिकोण के समान संभाला जाता है, जिसमें निश्चित लंबाई वाले खंड होते हैं जो कि गद्देदार होते हैं, जो अर्हता प्राप्त करेंगे। या, यदि यह सुनिश्चित करना आसान नहीं था कि द्विआधारी प्रतिनिधित्व स्वाभाविक रूप से उचित तरीके से आदेश दिया जाएगा, तो आप यूडीटी की एक विधि या संपत्ति को उजागर कर सकते हैं जो एक मूल्य का उत्पादन करता है जो ठीक से आदेश दिया जाएगा, और फिर PERSISTED
उस पर एक गणना कॉलम बना सकते हैं विधि या संपत्ति। विधि को नियतात्मक और के रूप में चिह्नित करने की आवश्यकता है IsDeterministic = true
।
इस दृष्टिकोण के लाभ हैं:
- "मूल मान" फ़ील्ड की आवश्यकता नहीं है।
- डेटा डालने या मूल्यों की तुलना करने के लिए UDF को कॉल करने की आवश्यकता नहीं है। यह मानते हुए कि
Parse
यूडीटी की विधि P7B18
मूल्य में ले जाती है और इसे रूपांतरित करती है, तो आपको बस स्वाभाविक रूप से मानों को सम्मिलित करने में सक्षम होना चाहिए P7B18
। और यूडीटी में निहित निहित रूपान्तरण विधि के साथ, WHERE की स्थिति भी बस P7B18` का उपयोग करने की अनुमति देगी।
इस दृष्टिकोण के परिणाम हैं:
- यदि बाइट का उपयोग करके UDT को स्तंभ डेटाटाइप के रूप में उपयोग किया जाता है, तो बस फ़ील्ड का चयन करना बाइनरी प्रतिनिधित्व को वापस कर देगा। या
PERSISTED
यूडीटी की संपत्ति या विधि पर एक गणना किए गए कॉलम का उपयोग करते हैं, तो आपको संपत्ति या विधि द्वारा वापस लौटाया गया प्रतिनिधित्व मिलेगा। यदि आप मूल P7B18
मूल्य चाहते हैं , तो आपको यूडीटी की एक विधि या संपत्ति को कॉल करने की आवश्यकता है जो उस प्रतिनिधित्व को वापस करने के लिए कोडित है। चूँकि आपको ToString
विधि को वैसे भी ओवरराइड करना होगा , इसलिए यह प्रदान करने के लिए एक अच्छा उम्मीदवार है।
यह स्पष्ट नहीं है (कम से कम मेरे लिए अभी से जब से मैंने इस भाग का परीक्षण नहीं किया है) बाइनरी प्रतिनिधित्व में कोई भी बदलाव करना कितना आसान / कठिन होगा। संग्रहीत को बदलना, सॉर्ट करने योग्य प्रतिनिधित्व को छोड़ने और क्षेत्र को फिर से जोड़ने की आवश्यकता हो सकती है। इसके अलावा, यूडीटी युक्त असेंबली को गिराना यदि किसी भी तरीके से उपयोग किया जाता है, तो यह विफल हो जाएगा, इसलिए आप यह सुनिश्चित करना चाहेंगे कि इस यूडीटी के अलावा विधानसभा में और कुछ नहीं था। आप ALTER ASSEMBLY
परिभाषा को बदल सकते हैं , लेकिन उस पर कुछ प्रतिबंध हैं।
दूसरी ओर, VARCHAR()
फ़ील्ड डेटा है जिसे एल्गोरिथ्म से डिस्कनेक्ट किया गया है, इसलिए इसे केवल कॉलम को अपडेट करने की आवश्यकता होगी। और अगर लाखों पंक्तियाँ (या अधिक) हैं तो वह एक बैचबद्ध दृष्टिकोण में किया जा सकता है।
आईसीयू पुस्तकालय को लागू करें जो वास्तव में इस अल्फ़ान्यूमेरिक सॉर्टिंग को करने की अनुमति देता है। अत्यधिक कार्यात्मक होते हुए, पुस्तकालय केवल दो भाषाओं में आता है: C / C ++ और Java। इसका मतलब है कि आपको विजुअल C ++ में काम करने के लिए या तो कुछ ट्वीक्स करने की आवश्यकता हो सकती है, या इस बात की संभावना है कि IKVM का उपयोग करके जावा कोड को MSIL में परिवर्तित किया जा सकता है । उस साइट पर एक या दो .NET साइड प्रोजेक्ट जुड़े हुए हैं जो एक COM इंटरफ़ेस प्रदान करते हैं जिसे प्रबंधित कोड में एक्सेस किया जा सकता है, लेकिन मेरा मानना है कि उन्हें थोड़ी देर में अपडेट नहीं किया गया है और मैंने उन्हें आज़माया नहीं है। यहाँ सबसे अच्छी शर्त यह होगी कि इसे एप्लिकेशन लेयर में सॉर्ट कीज़ बनाने के लक्ष्य के साथ हैंडल किया जाए। फिर सॉर्ट कीज़ को एक नए सॉर्ट कॉलम में सहेजा जाएगा।
यह सबसे व्यावहारिक दृष्टिकोण नहीं हो सकता है। हालांकि, यह अभी भी बहुत अच्छा है कि ऐसी क्षमता मौजूद है। मैंने निम्नलिखित उत्तर में इसका एक और अधिक विस्तृत वॉक-थ्रू प्रदान किया:
क्या निम्नलिखित क्रम 1,2,3,6,10,10A, 10B, 11 में निम्नलिखित तारों को क्रमबद्ध करने के लिए कोई टकराव है?
लेकिन उस प्रश्न से निपटा जा रहा पैटर्न थोड़ा सरल है। एक उदाहरण के लिए, जिसमें दिखाया गया है कि इस प्रश्न में किस प्रकार का पैटर्न है, यह भी काम करता है, कृपया निम्न पृष्ठ पर जाएं:
ICU Collation Demo
"सेटिंग" के तहत, "संख्यात्मक" विकल्प को "चालू" पर सेट करें और अन्य सभी को "डिफ़ॉल्ट" पर सेट किया जाना चाहिए। अगला, "सॉर्ट" बटन के दाईं ओर, "अलग-अलग ताकत" के लिए विकल्प को अनचेक करें और "सॉर्ट कुंजी" के लिए विकल्प की जांच करें। फिर निम्नलिखित सूची के साथ "इनपुट" टेक्स्ट क्षेत्र में आइटम की सूची को बदलें:
P12B22
P7B18
P12B3
as456456hgjg6786867
P7Bb19
P7BA19
P7BB19
P007B18
P7Bb20
P7Bb19z23
"सॉर्ट" बटन पर क्लिक करें। "आउटपुट" पाठ क्षेत्र को निम्नलिखित प्रदर्शित करना चाहिए:
as456456hgjg6786867
29 4D 0F 7A EA C8 37 35 3B 35 0F 84 17 A7 0F 93 90 , 0D , , 0D .
P7B18
47 0F 09 2B 0F 14 , 08 , FD F1 , DC C5 DC 05 .
P007B18
47 0F 09 2B 0F 14 , 08 , FD F1 , DC C5 DC 05 .
P7BA19
47 0F 09 2B 29 0F 15 , 09 , FD FF 10 , DC C5 DC DC 05 .
P7Bb19
47 0F 09 2B 2B 0F 15 , 09 , FD F2 , DC C5 DC 06 .
P7BB19
47 0F 09 2B 2B 0F 15 , 09 , FD FF 10 , DC C5 DC DC 05 .
P7Bb19z23
47 0F 09 2B 2B 0F 15 5B 0F 19 , 0B , FD F4 , DC C5 DC 08 .
P7Bb20
47 0F 09 2B 2B 0F 16 , 09 , FD F2 , DC C5 DC 06 .
P12B3
47 0F 0E 2B 0F 05 , 08 , FD F1 , DC C5 DC 05 .
P12B22
47 0F 0E 2B 0F 18 , 08 , FD F1 , DC C5 DC 05 .
कृपया ध्यान दें कि विभिन्न कुंजियों में क्रमबद्ध कुंजियाँ कॉमा द्वारा अलग की गई हैं। प्रत्येक फ़ील्ड को स्वतंत्र रूप से सॉर्ट करने की आवश्यकता होती है, ताकि SQL सर्वर में इसे लागू करने की आवश्यकता होने पर हल करने के लिए एक और छोटी समस्या प्रस्तुत हो।
P7B12
बन सकता हैP 07 B 12
, तो (ASCII के माध्यम से)80 07 65 12
, इसलिए80076512