स्पष्टीकरण इस तरह के लिंक से बंधे हुए प्रतीत होता है: क) इस प्रश्न में उल्लेखित ब्लॉग से विस्तार नहीं किया गया है, ख) टीवीपीएस फिटिंग की व्यावहारिकता कैसे मापदंडों को हमेशा अंदर और बाहर, सी) और प्रकृति में पारित किया गया है। तालिका चर की।
लिंक किए गए ब्लॉग पोस्ट में मौजूद अनुपलब्ध विवरण बिल्कुल वैसा ही है, जिसमें स्टोर्ड प्रोसीजर और फ़ंक्शंस में वेरिएबल्स को पास और आउट किया जाता है (जो "पास-ऑफ़-रेफ़रेंस के सुरक्षित संस्करण के प्रश्न से संबंधित है, यदि वे OUTPUT पैरामीटर हैं") :
TSQL संग्रहीत प्रक्रियाओं और कार्यों के लिए मापदंडों को पारित करने के लिए एक कॉपी-इन / कॉपी-आउट शब्दार्थ का उपयोग करता है ...।
... जब संग्रहित किए गए अधिप्राप्ति को निष्पादित करने में त्रुटि होती है (बिना किसी त्रुटि के) एक कॉपी-आउट बनाई जाती है, जो किसी भी परिवर्तन के साथ पारित पैरामीटर को अद्यतन करता है जो कि संग्रहीत खरीद में किए गए थे।
इस दृष्टिकोण का वास्तविक लाभ त्रुटि मामले में है। यदि संग्रहीत कार्यविधि के निष्पादन के बीच में कोई त्रुटि होती है, तो मापदंडों में किए गए कोई भी परिवर्तन कॉलर को वापस प्रचारित नहीं करेंगे।
यदि OUTPUT कीवर्ड मौजूद नहीं है तो कोई भी कॉपी-आउट नहीं किया जाता है।
नीचे की रेखा:
संग्रहीत प्रोम के पैरामीटर कभी भी संग्रहित खरीद के आंशिक निष्पादन को प्रतिबिंबित नहीं करते हैं यदि यह एक त्रुटि का सामना करना पड़ा।
इस पहेली का भाग 1 यह है कि मापदंडों को हमेशा "मूल्य से" पारित किया जाता है। और, यह केवल तब होता है जब पैरामीटर को चिह्नित किया जाता है OUTPUT
और संग्रहीत प्रक्रिया सफलतापूर्वक पूरी होती है कि वर्तमान मूल्य वास्तव में वापस भेजा जाता है। यदि OUTPUT
मान वास्तव में "संदर्भ द्वारा" पारित किए गए थे, तो उस चर की याद में स्थान के लिए सूचक वह चीज़ होगी जो पारित हो गई थी, न कि स्वयं मूल्य। और यदि आप पॉइंटर (यानी मेमोरी एड्रेस) में पास होते हैं तो किए गए किसी भी बदलाव को तुरंत परिलक्षित किया जाता है, भले ही संग्रहीत प्रक्रिया की अगली पंक्ति में त्रुटि हो और यह निष्पादन को रोक देता है।
भाग 1 को सम्मिलित करने के लिए: चर मान हमेशा कॉपी किए जाते हैं; उन्हें उनके स्मृति पते से संदर्भित नहीं किया जाता है।
भाग 1 को ध्यान में रखते हुए, हमेशा परिवर्तनशील मूल्यों को कॉपी करने की नीति संसाधन मुद्दों को जन्म दे सकती है जब चर को पारित किया जा रहा है। मैं यह देखने के लिए ब्लॉब प्रकार नियंत्रित किया जाता है परीक्षण नहीं किया ( VARCHAR(MAX)
, NVARCHAR(MAX)
, VARBINARY(MAX)
, XML
, और उन है कि अब और नहीं किया जाना चाहिए: TEXT
, NTEXT
, और IMAGE
), लेकिन यह सुरक्षित कहना है कि डेटा के किसी भी तालिका पारित किया जा रहा में काफी बड़ी हो सकता है। यह उन लोगों के लिए समझ में आता है जो टीवीपी फीचर को विकसित करने के लिए एक सच्चे "पास-बाय-रेफरेंस" की इच्छा रखते हैं, ताकि उनके कूल नए फीचर को एक स्वस्थ संख्या प्रणाली को नष्ट करने से रोका जा सके (अर्थात अधिक स्केलेबल अप्रोच चाहते हैं)। जैसा कि आप प्रलेखन में देख सकते हैं कि उन्होंने क्या किया:
Transact-SQL इनपुट डेटा की एक प्रतिलिपि बनाने से बचने के लिए संदर्भ द्वारा दिनचर्या के लिए टेबल-मूल्यवान पैरामीटर पास करता है।
इसके अलावा, यह स्मृति प्रबंधन चिंता एक नई अवधारणा नहीं थी क्योंकि यह SQLCLR API में पाया जा सकता है जो SQL Server 2005 (TVPs SQL सर्वर 2008 में पेश किया गया था) में पेश किया गया था। SQLCLR कोड में पासिंग NVARCHAR
और VARBINARY
डेटा (यानी एक SQLCLR असेंबली के भीतर .NET विधियों पर इनपुट पैरामीटर), आपके पास SqlString
या तो SqlBinary
क्रमशः उपयोग करके "मूल्य द्वारा" दृष्टिकोण के साथ जाने का विकल्प है , या आप "संदर्भ द्वारा" के साथ जा सकते हैं " SqlChars
या तो या SqlBytes
क्रमशः का उपयोग करके दृष्टिकोण । । SqlChars
और SqlBytes
प्रकार .NET सीएलआर में डेटा की पूरी स्ट्रीमिंग के लिए अनुमति देते हैं, ताकि आप पूरे 200 एमबी (अप करने के लिए 2 जीबी, दाईं ओर) मान कॉपी करने के विरोध में बड़े मानों के छोटे हिस्से खींच सकें।
भाग 2 की गणना करने के लिए: टीवीपी, अपने स्वभाव से, बहुत अधिक मेमोरी (और इसलिए खराब होने वाले प्रदर्शन) का उपभोग करने की प्रवृत्ति होगी यदि "हमेशा मूल्य को कॉपी करें" मॉडल के भीतर रहें। इसलिए TVP एक "संदर्भ द्वारा पास" एक सच्चा काम करते हैं।
अंतिम टुकड़ा यही कारण है कि भाग 2 मायने रखता है: क्यों एक टीवीपी में वास्तव में "संदर्भ से" गुजरता है, इसके बजाय इसकी प्रतिलिपि बनाने से कुछ भी बदल जाता है। और इसका उत्तर उस डिज़ाइन लक्ष्य द्वारा दिया गया है जो भाग 1 के लिए आधार है: संग्रहीत कार्यविधियाँ जो सफलतापूर्वक पूरी नहीं होती हैं, किसी भी तरह से, इनपुट मापदंडों में से किसी में भी परिवर्तन नहीं होना चाहिए, चाहे वे चिह्नित हों OUTPUT
या नहीं। डीएमएल संचालन की अनुमति देने से टीवीपी के मूल्य पर तत्काल प्रभाव पड़ेगा क्योंकि यह कॉलिंग संदर्भ में मौजूद है (संदर्भ से गुजरने के बाद से आप उस चीज़ को बदल रहे हैं जिसे पारित किया गया था, जो पारित नहीं किया गया था की एक प्रति)।
अब, कोई, कहीं न कहीं, इस बिंदु पर शायद उनके मॉनिटर से बात कर रहा है, "ठीक है, बस TVP मापदंडों में किए गए किसी भी बदलाव को वापस करने के लिए एक स्वचालित सुविधा में निर्माण करें यदि कोई भी संग्रहीत प्रक्रिया में पारित किया गया था। इतना शीघ्र नही। यह वह जगह है जहाँ टेबल वेरिएबल्स की प्रकृति आती है: टेबल वेरिएबल्स में किए गए परिवर्तन लेन-देन से बाध्य नहीं हैं! इसलिए परिवर्तनों को वापस लाने का कोई तरीका नहीं है। और वास्तव में, यह एक ट्रिक है जिसका उपयोग किसी लेन-देन के भीतर उत्पन्न जानकारी को बचाने के लिए किया जाता है यदि रोलबैक :-) होने की आवश्यकता होती है।
भाग 3 को सम्मिलित करने के लिए: टेबल-वेरिएबल त्रुटि के मामले में उनके लिए किए गए "पूर्ववत" परिवर्तनों की अनुमति नहीं देता है, जिसके कारण संग्रहित प्रक्रिया निरस्त हो जाती है। और यह उन मापदंडों के डिजाइन लक्ष्य का उल्लंघन करता है जो कभी भी आंशिक निष्पादन (भाग 1) को प्रतिबिंबित नहीं करते हैं।
TYPE
चर या कDECLARE x as TABLE (...)
) को संशोधित करने का कोई तरीका नहीं है ? क्या मैं इसे कर सकता हूं, एक बड़े स्मृति पदचिह्न के साथ, एक फ़ंक्शन के साथset @tvp = myfunction(@tvp)
यदि मेरे फ़ंक्शन काRETURNS
मान टीवीपी प्रकार के समान DDL के साथ एक तालिका है?