Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मास्टर..spt_values ​​​​का उपयोग करके कॉलम को विभाजित करने के लिए क्यों (और कैसे)?

उद्देश्य

अदस्तावेज का उपयोग क्यों करें master..spt-values

Sybase, और इसलिए इसके कमीने बेटे MS SQL, उत्पाद के लिए विभिन्न सुविधाएँ और कार्य प्रदान करते हैं, जो सिस्टम प्रक्रियाओं में लागू होते हैं (जैसा कि sqlserver जैसे बायनेरिज़ के विपरीत, जो एक सेवा के रूप में शुरू किए जाते हैं)। ये सिस्टम कार्यविधियाँ SQL कोड में लिखी गई हैं और इनका नाम sp_%. . है कुछ गुप्त इंटर्नल को छोड़कर, उनकी सीमाएँ और ज़रूरतें किसी भी अन्य SQL कोड के समान हैं। वे Sybase ASE या SQL सर्वर उत्पाद का हिस्सा हैं। जैसे, वे आवश्यक नहीं हैं इसे दस्तावेज करने के लिए; और आंतरिक बिट्स को उचित रूप से "अनियंत्रित" के रूप में लेबल नहीं किया जा सकता है।

master..spt_values विभिन्न रिपोर्ट तैयार करने के लिए, SQL तालिका में उक्त सिस्टम प्रक्रियाओं के लिए आवश्यक सभी विभिन्न बिट्स और टुकड़े शामिल हैं। sp मतलब सिस्टम प्रक्रिया; spt सिस्टम प्रक्रियाओं के लिए टेबल का मतलब है; और निश्चित रूप से values सामग्री है।

लुकअप टेबल

क्या है (का अर्थ) प्रकार ='पी'

लोग अक्सर spt_values . का वर्णन करते हैं "डी-सामान्यीकृत" के रूप में, लेकिन यह गलत शब्द है। सही शब्द है मुड़ा हुआ , या पैक . यह 26 या तो तार्किक लुकअप टेबल है, प्रत्येक खूबसूरती से सामान्यीकृत, एक भौतिक तालिका में तब्दील, एक Type के साथ तार्किक तालिकाओं में अंतर करने के लिए स्तंभ।

अब एक सामान्य डेटाबेस में, यह एक सकल त्रुटि होगी (बस "एक लुकअप टेबल या कई" के उत्तरों को देखें)। लेकिन सर्वर कैटलॉग में, यह वांछनीय है, यह 26 भौतिक तालिकाओं को प्रतिस्थापित करता है।

  • "L" का अर्थ लॉक टाइप लुकअप है; "वी" डिवाइस टाइप लुकअप के लिए खड़ा है (वी पूरे सर्वर में डिवाइस के लिए छोटा है); आदि। टाइप करें "P2" में बिटवाइज़ ऑर्डिनल्स होते हैं, जो बिट्स के विस्तार के लिए एक INT में पैक किए जाते हैं।

  • प्रोजेक्शन करने के लिए ज्ञात सीमाओं के भीतर लगातार संख्याओं का एक सेट, जो SQL तालिका के रूप में उपलब्ध है, की आवश्यकता होती है, जो कि कई सिस्टम प्रक्रियाओं को करना होता है। टाइप "P" 0 और 2047 के बीच लगातार संख्याओं की एक सूची है।

  • शब्द प्रक्षेपण यहां तकनीकी रूप से सटीक अर्थ, प्राकृतिक तार्किक अर्थ के रूप में उपयोग किया जाता है, न कि संबंधपरक बीजगणित अर्थ, जो कि अप्राकृतिक है।

इसलिए spt_values, . के लिए केवल एक ही उद्देश्य है 26 गुना, अन्यथा अलग, संदर्भ तालिका, और एक प्रोजेक्शन तालिका शामिल करने के लिए।

विस्तार

spt_values . का सामान्य उपयोग फिर, एक सामान्य लुकअप या संदर्भ या ENUM . के रूप में है टेबल। सबसे पहले, लुकअप मान:

    SELECT *                    -- list Genders
        FROM Gender 

इसका उपयोग उसी तरह किया जाता है जैसे व्यक्ति के पास एक लिंग कोड होता है जिसे विस्तारित करने की आवश्यकता होती है (बहुत विस्तारित, ये अजीब दिन):

    SELECT  P.*,                -- list Person
            G.Name              -- expand GenderCode to Name
        FROM Person P
        JOIN Gender G
            ON P.GenderCode = G.GenderCode

उदा. sp_lock सक्रिय ताले की एक रिपोर्ट तैयार करता है, लॉक प्रकारों को स्ट्रिंग नाम . के रूप में प्रदर्शित करता है . लेकिन master..syslocks संख्याओं . के रूप में लॉक प्रकार होते हैं , इसमें वे नाम . शामिल नहीं हैं; और अगर ऐसा होता है, तो यह एक बुरी तरह से विकृत तालिका होगी! यदि आप क्वेरी निष्पादित करते हैं (Sybase ASE कोड, आपको कनवर्ट करना होगा):

    SELECT *                    -- list LockTypes
        FROM master..spt_values 
        WHERE type = "L"

आप 66 लॉक टाइप नंबर देखेंगे और नाम लुकअप टेबल में। यह अनुमति देता है sp_lock ऊपर दिए गए व्यक्ति ::लिंग जैसे सरल कोड निष्पादित करने के लिए:

    SELECT  spid,               -- list Active Locks
            DB_NAME(dbid),
            OBJECT_NAME(id, dbid),
            v.name,             -- expand lock name
            page,
            row
    FROM master..syslocks   L,
         master..spt_values LT
    WHERE L.type = LT.number    -- 
    AND   type = "L"            -- LockType Lookup table
    ORDER by 1, 2, 3, 4, 5, 6   -- such that perusal is easy

प्रक्षेपण

(अर्थ) प्रकार ='पी' क्या है?

प्रोजेक्शन क्या है और इसका उपयोग कैसे किया जाता है?

उदाहरण के लिए, उदाहरण के लिए, उपरोक्त क्वेरी द्वारा निर्मित सक्रिय लॉक के बजाय, आप सभी की एक सूची चाहते थे 66 लॉकटाइप, सक्रिय लॉक (या नल) की संख्या दिखा रहा है। आपको किसी कर्सर या WHILE . की आवश्यकता नहीं है कुंडली। हम प्रोजेक्ट कर सकते थे लॉकटाइप लुकअप तालिका, के माध्यम से सक्रिय तालों की संख्या:

    SELECT  LT.name,            -- list LockTypes
            [Count] = (         -- with count
        SELECT COUNT(*)
            FROM master..syslocks
            WHERE type = LT.number
                )
        FROM master..spt_values LT
        WHERE type = "L"

कई तरीके हैं, वह सिर्फ एक है। एक अन्य तरीका सबक्वेरी के बजाय व्युत्पन्न तालिका का उपयोग करना है। लेकिन आपको अभी भी प्रोजेक्शन की जरूरत है।

आमतौर पर यही spt_values . होता है विस्तार या प्रक्षेपण के लिए प्रयोग किया जाता है। अब जब आप जानते हैं कि यह वहां है, तो आप इसका उपयोग भी कर सकते हैं। यह सुरक्षित है (master . में डेटाबेस) और लगभग सभी सिस्टम प्रक्रियाओं द्वारा उपयोग किया जाता है, जिसका अर्थ है कि सिस्टम प्रक्रियाएं इसके बिना नहीं चल सकती हैं।

स्तंभ को विभाजित करने के लिए?

आह, आप "एक CSV कॉलम को कई पंक्तियों में विभाजित करें" कोड को नहीं समझते हैं।

  • spt_values के बारे में भूल जाओ एक पल के लिए, और उस कोड को दोबारा जांचें। इसे केवल लगातार संख्याओं की एक सूची की आवश्यकता है, ताकि सीएसवी कॉलम में बाइट द्वारा बाइट में मानों की सूची के माध्यम से कदम उठाया जा सके। कोड केवल प्रत्येक बाइट के लिए सक्रिय होता है जो एक अल्पविराम, या अंत-स्ट्रिंग है।

  • स्क्रैच से एक बनाने और उसमें डालने के बजाय, SQL तालिका के रूप में लगातार संख्याओं का एक सेट कहां प्राप्त करें? क्यों, master..spt_values बेशक। यदि आप जानते हैं कि यह वहां है।

  • (आप केवल सिस्टम संग्रहीत कार्यविधियों के कोड को पढ़कर, ASE या SQL सर्वर के आंतरिक के बारे में कुछ सीख सकते हैं।)

  • ध्यान दें कि एक कॉलम में कोई भी CSV फ़ील्ड एक सकल सामान्यीकरण त्रुटि है, यह 2NF (दोहराए जाने वाले मान होते हैं) और 1NF (परमाणु नहीं) को तोड़ता है। ध्यान दें, यह पैक या फोल्ड नहीं है, यह एक दोहराव वाला समूह है, यह गैर-सामान्यीकृत है। ऐसी सकल त्रुटि के कई नकारात्मक परिणामों में से एक है, दोहराए जाने वाले समूह को पंक्तियों के रूप में नेविगेट करने के लिए सरल एसक्यूएल का उपयोग करने के बजाय, किसी को गैर-सामान्यीकृत सीएसवी फ़ील्ड की सामग्री को निर्धारित करने और निकालने के लिए जटिल कोड का उपयोग करना पड़ता है। यहां spt_values P उस जटिल कोड के लिए एक वेक्टर प्रदान करता है, जिससे यह आसान हो जाता है।

इसका क्या लाभ है?

मुझे लगता है कि मैंने इसका उत्तर दे दिया है। यदि आपके पास यह नहीं था, तो प्रत्येक सिस्टम प्रक्रिया जिसके लिए संख्याओं की सूची की आवश्यकता होती है, एक अस्थायी तालिका बनाना होगा; और इसमें पंक्तियाँ डालें; अपना कोड चलाने से पहले। बेशक, उन चरणों का पालन न करने से, सिस्टम प्रक्रियाएँ बहुत तेज़ हो जाती हैं।

अब, जब आपको प्रोजेक्शन करने की आवश्यकता हो, जैसे। भविष्य में कैलेंडर तिथियां, या जो भी हो, आप spt_values . का उपयोग कर सकते हैं , हर बार अपनी खुद की अस्थायी तालिका बनाने के बजाय (या अपनी निजी स्थायी तालिका बनाएं और इसे बनाए रखें)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर प्रबंधन स्टूडियो में वास्तविक CSV प्रारूप में निर्यात आउटपुट कैसे प्राप्त करें?

  2. SQL - प्रत्येक रिकॉर्ड के लिए कॉल संग्रहीत प्रक्रिया

  3. SQL सर्वर में पहचान कॉलम को कैसे अपडेट करें?

  4. SQL सर्वर डेटाबेस के बैकअप के लिए एक साधारण कमांड लाइन प्रोग्राम या स्क्रिप्ट क्या है?

  5. SQL सर्वर में SHOWPLAN_XML कैसे काम करता है