आप T-SQL CREATE FUNCTION
का उपयोग करके SQL सर्वर में एक इनलाइन टेबल-वैल्यू फंक्शन (ITVF) बना सकते हैं। वाक्य रचना।
सिंटैक्स
इनलाइन टीवीएफ के लिए आधिकारिक सिंटैक्स यहां दिया गया है।
बनाएं [या बदलें] समारोह [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] पैरामीटर_डेटा_टाइप [ =डिफ़ॉल्ट ] [ READONLY ] } [ ,...n ] ] ) रिटर्न टेबल [के साथ [ ,...n ] ] [ AS ] वापसी [( ] select_stmt [ ) ] [; ]
उदाहरण 1 - बेसिक ITVF
यहां एक बुनियादी इनलाइन तालिका-मूल्यवान फ़ंक्शन का उदाहरण दिया गया है।
CREATE FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) TABLEASRETURN लौटाता है (CateId, CatName, dbo से फोन चुनें।इस मामले में, फ़ंक्शन को तर्क के रूप में बिल्ली नाम को पारित करने की आवश्यकता होती है। इसके बाद यह संबंधित डेटा को वापस करने के लिए क्वेरी में इस तर्क का उपयोग करता है।
उदाहरण 2 - स्कीमा बाइंडिंग जोड़ें
आमतौर पर यह एक अच्छा विचार है कि
SCHEMABINDING
. का उपयोग करके स्कीमा आपके कार्यों को बांधे बहस।ऐसा करने से यह सुनिश्चित होगा कि अंतर्निहित तालिकाओं को इस तरह से नहीं बदला जा सकता है जो आपके कार्य को प्रभावित करेगा।
स्कीमा बाइंडिंग के बिना, अंतर्निहित तालिकाओं को संशोधित या हटाया भी जा सकता है। ऐसा करने से फंक्शन टूट सकता है।
यहाँ वही फ़ंक्शन है, लेकिन इस बार स्कीमा बाइंडिंग के साथ:
CREATE FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) SCHEMABINDINGASRETURN के साथ रिटर्न टेबल (CateId, CatName, dbo से फोन चुनें। CatName =@CatName); जाओध्यान दें कि मैंने अपनी क्वेरी में तालिका को संदर्भित करते समय दो-भाग के नाम का उपयोग किया था (मैंने
dbo.Cats
का उपयोग किया था तालिका का संदर्भ देते समय, केवलCats
. के बजाय ) ऐसा करना किसी ऑब्जेक्ट को बाध्य करने वाले स्कीमा के लिए एक आवश्यकता है। यदि आप दो-भाग नामों का उपयोग किए बिना किसी ऑब्जेक्ट को स्कीमा बाइंड करने का प्रयास करते हैं तो आपको एक त्रुटि मिलेगी।अब जब मैंने स्कीमा को अपने फ़ंक्शन के लिए बाध्य कर दिया है, यदि मैं इसकी परिभाषा में संदर्भित तालिका को छोड़ने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है:
DROP TABLE Cats;परिणाम:
संदेश 3729, स्तर 16, राज्य 1, पंक्ति 1 तालिका 'बिल्लियों' को नहीं छोड़ सकती क्योंकि इसे ऑब्जेक्ट 'udf_CatsByName_ITVF' द्वारा संदर्भित किया जा रहा है।वैसे, अगर मैं दो-भाग के नामकरण का उपयोग किए बिना फ़ंक्शन बनाने का प्रयास करता हूं, तो यहां क्या होता है:
CREATE FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) SCHEMABINDINGASRETURN के साथ रिटर्न टेबल (CateId, CatName, Cats से फोन चुनें जहां CatName =@CatName);GOपरिणाम:
मैसेज 4512, लेवल 16, स्टेट 3, प्रक्रिया udf_CatsByName_ITVF, लाइन 7स्कीमा बाइंड टेबल वैल्यू फंक्शन 'dbo.udf_CatsByName_ITVF' नहीं कर सकता क्योंकि 'कैट्स' नाम स्कीमा बाइंडिंग के लिए अमान्य है। नाम दो-भाग प्रारूप में होने चाहिए और कोई वस्तु स्वयं को संदर्भित नहीं कर सकती है।उदाहरण 3 - एन्क्रिप्शन जोड़ें
आप
ENCRYPTION
. का उपयोग करके अपने कार्यों को एन्क्रिप्ट भी कर सकते हैं बहस।यहां फ़ंक्शन को एन्क्रिप्ट करने का एक उदाहरण दिया गया है:
CREATE FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) SCHEMABINDING, ENCRYPTIONASRETURN के साथ तालिका लौटाता है ( CatId, CatName, dbo से फोन चुनें।अब मैं फ़ंक्शन की परिभाषा नहीं देख पा रहा हूँ।
sys.sql_modules से परिभाषा चुनें, जहां object_id =OBJECT_ID('udf_CatsByName_ITVF');परिणाम:
+--------------+| परिभाषा ||--------------|| नल |+--------------+Azure डेटा स्टूडियो के माध्यम से फ़ंक्शन की परिभाषा को स्क्रिप्ट करने का प्रयास करते समय मुझे एक त्रुटि संदेश भी मिलता है:
क्रिएट ऑन ऑब्जेक्ट UserDefinedFunction के रूप में स्क्रिप्टिंग करते समय कोई स्क्रिप्ट वापस नहीं की गई थीध्यान दें कि एक एन्क्रिप्टेड फ़ंक्शन का टेक्स्ट अभी भी विशेषाधिकार प्राप्त उपयोगकर्ताओं के लिए उपलब्ध है जो या तो डीएसी पोर्ट पर सिस्टम टेबल तक पहुंच सकते हैं या सीधे डेटाबेस फाइलों तक पहुंच सकते हैं। साथ ही, जो उपयोगकर्ता डिबगर को सर्वर प्रक्रिया में संलग्न कर सकते हैं, वे रनटाइम पर स्मृति से मूल प्रक्रिया को पुनः प्राप्त कर सकते हैं।