SQL सर्वर में उपलब्ध कई डेटा प्रकारों के अतिरिक्त, आपके पास अपना स्वयं का डेटा प्रकार बनाने का विकल्प भी होता है। इनमें से कुछ को "उपयोगकर्ता-परिभाषित डेटा प्रकार" के रूप में संदर्भित किया जाता है, जबकि अन्य को "उपनाम डेटा प्रकार" के रूप में संदर्भित किया जाता है।
एक उपयोगकर्ता-परिभाषित डेटा प्रकार Microsoft.NET Framework सामान्य भाषा रनटाइम (CLR) में एक असेंबली के एक वर्ग के माध्यम से कार्यान्वित किया जाता है।
एक उपनाम डेटा प्रकार एक SQL सर्वर देशी सिस्टम प्रकार पर आधारित है। दूसरे शब्दों में, आप अपने उपनाम डेटा प्रकार के आधार पर मौजूदा डेटा प्रकार का उपयोग करते हैं।
ऐसा कहने के बाद, मैंने माइक्रोसॉफ्ट को उपनाम डेटा प्रकार का जिक्र करते समय "उपयोगकर्ता द्वारा परिभाषित डेटा प्रकार उपनाम" शब्द का उपयोग करते देखा है। मैंने इसे केवल "डेटा प्रकार उपनाम" के रूप में संदर्भित किया है।
किसी भी तरह से, यह आलेख दर्शाता है कि Transact-SQL का उपयोग करके उपयोगकर्ता द्वारा परिभाषित डेटा प्रकार उपनाम कैसे बनाया जाए।
उदाहरण 1 - उपनाम डेटा प्रकार बनाएं
एक उपनाम डेटा प्रकार बनाने के लिए, एक CREATE TYPE
चलाएं उस डेटाबेस के विरुद्ध कथन जिसे आप उपनाम डेटा प्रकार बनाना चाहते हैं।
यहां एक कोड उदाहरण दिया गया है जो SQL सर्वर varchar के आधार पर उपयोगकर्ता द्वारा परिभाषित डेटा प्रकार का उपनाम बनाता है डेटा प्रकार:
टेस्ट का उपयोग करें; वर्चर से टाइप क्लाइंटकोड बनाएं (8) न्यूल नहीं;
परिणाम:
कमांड सफलतापूर्वक पूरे हुए। कुल निष्पादन समय:00:00:00.028
इस मामले में, मैं क्लाइंटकोड . नामक एक उपनाम डेटा प्रकार बनाता हूं परीक्षण . नामक डेटाबेस में .
मेरा उपनाम varchar(8) . पर आधारित है , जिसका अर्थ है कि यह लंबाई में 8 बाइट्स तक की चर लंबाई वाली स्ट्रिंग हो सकती है। सिंगल-बाइट एन्कोडिंग वर्ण सेट (जैसे लैटिन) के लिए, यह 8 वर्णों तक संग्रहीत करेगा। हालांकि, मल्टी-बाइट एन्कोडिंग वर्ण सेट के लिए, वर्णों की संख्या कम हो सकती है।
उदाहरण 2 - उपनाम डेटा प्रकार देखें
आप sys.types
. का उपयोग कर सकते हैं अपने उपनाम डेटा प्रकार के विवरण की जांच करने के लिए:
चुनें * sys.types से जहां नाम ='क्लाइंटकोड';
परिणाम:
नाम | clientcodesystem_type_id | 167user_type_id | 257schema_id | 1प्रिंसिपल_आईडी | NULLmax_length | 8सटीक | 0स्केल | 0collation_name | SQL_Latin1_General_CP1_CI_ASis_nullable | 0is_user_defined | 1is_assembly_type | 0default_object_id | 0rule_object_id | 0is_table_type | 0
हम देख सकते हैं कि is_user_defined इस डेटा प्रकार के लिए ध्वज 1 है , जिसका अर्थ है कि यह एक उपयोगकर्ता परिभाषित डेटा प्रकार है।
इस उदाहरण में मैंने परिणामों को केवल
क्लाइंटकोड
. तक सीमित कर दिया है डेटा प्रकार। आप sys.types
. का उपयोग कर सकते हैं डेटाबेस में सभी डेटा प्रकारों की जानकारी वापस करने के लिए। अधिक जानकारी के लिए SQL सर्वर में डेटा प्रकारों की सूची कैसे लौटाएं देखें।
अब जबकि उपनाम डेटा प्रकार बना दिया गया है, हम आगे बढ़ सकते हैं और इसका उपयोग कर सकते हैं।
उदाहरण 3 - उपनाम का उपयोग करने वाली तालिका बनाएं
इस उदाहरण में मैं एक तालिका बनाता हूं जो मेरे नए बनाए गए डेटा प्रकार उपनाम का उपयोग इसकी एक कॉलम परिभाषा में करती है।
टेस्ट का उपयोग करें; टेबल क्लाइंट बनाएं (क्लाइंटकोड क्लाइंटकोड प्राथमिक कुंजी, फर्स्टनाम वर्कर (50), लास्टनाम वर्कर (50));
हम तालिका के स्तंभों पर एक नज़र डाल सकते हैं:
सी.नाम, c.system_type_id, c.user_type_id, c.max_length, c.is_nullableFROM sys.columns चुनें, cINNER sys.tables से t.object_id =c.object_idWHERE t.name ='क्लाइंट';
परिणाम:
+---------------+---------------------+-------------- --+--------------+---------------+| नाम | system_type_id | user_type_id | मैक्स_लेंथ | is_nullable ||---------------+---------------------+--------------- -+--------------+---------------|| क्लाइंट कोड | 167 | 257 | 8 | 0 || प्रथम नाम | 167 | 167 | 50 | 1 || अंतिम नाम | 167 | 167 | 50 | 1 |+---------------+---------------------+-------------- -+--------------+---------------+
डेटा के और भी कई कॉलम हैं, लेकिन मैंने इसे केवल कुछ तक सीमित कर दिया है जो इस लेख के लिए प्रासंगिक हैं।
उदाहरण 4 - डेटा डालें
अब उस कॉलम में डेटा डालने का समय है जो हमारे उपयोगकर्ता-परिभाषित डेटा प्रकार उपनाम का उपयोग करता है।
क्लाइंट वैल्यू में डालें ('aaa00001', 'सातोशी', 'नाकामोतो');
और अब पंक्ति का चयन करें:
ग्राहक से *चुनें;
परिणाम:
+--------------+----------------+-----------+| क्लाइंट कोड | प्रथम नाम | अंतिम नाम ||--------------+----------------+---------------|| आआ00001 | सातोशी | नाकामोटो |+--------------+----------------+---------------+
इसलिए हम देख सकते हैं कि हमारे उपनाम डेटा प्रकार ने निर्दिष्ट डेटा को स्वीकार कर लिया है।
लेकिन जब तक हम इसे तोड़ने की कोशिश नहीं करेंगे तब तक यह एक उचित परीक्षा नहीं होगी।
आइए एक ऐसा मान डालने का प्रयास करें जो हमारे उपनाम का पालन नहीं करता है:
क्लाइंट वैल्यू में डालें ('aaaa00002', 'Mikko', 'Linnamäki');
परिणाम:
Msg 8152, Level 16, State 30, Line 1String या बाइनरी डेटा को छोटा कर दिया जाएगा।
इस मामले में मैंने एक मान डालने की कोशिश की जिसके लिए स्टोर करने के लिए 9 बाइट्स की आवश्यकता होगी, लेकिन उपनाम केवल 8 बाइट्स तक के मान स्वीकार करता है, इसलिए उसने इसे अस्वीकार कर दिया।
अगर मैं किसी एक पात्र को हटा दूं, तो यह ठीक काम करता है:
क्लाइंट वैल्यू में डालें ('aaa00002', 'Mikko', 'Linnamäki'); क्लाइंट से * चुनें;
परिणाम:
+--------------+----------------+-----------+| क्लाइंट कोड | प्रथम नाम | अंतिम नाम ||--------------+----------------+---------------|| आआ00001 | सतोशी | नाकामोतो || आआ00002 | मिक्को | लिन्नामाकी |+--------------+-------------+---------------+