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

SQL सर्वर में एक स्कीमा बाउंड UDF बनाएँ

SQL सर्वर में, आमतौर पर स्कीमा को आपके उपयोगकर्ता-परिभाषित कार्यों (UDFs) को बाँधना एक अच्छा विचार है।

आपके यूडीएफ को बाध्य करने वाली स्कीमा यह सुनिश्चित करेगी कि अंतर्निहित तालिकाओं को इस तरह से नहीं बदला जा सकता है जो आपके कार्य को प्रभावित करेगा। स्कीमा बाइंडिंग के बिना, अंतर्निहित तालिकाओं या अन्य वस्तुओं को संशोधित या हटाया भी जा सकता है। ऐसा करने से फंक्शन टूट सकता है।

स्कीमा बाउंड UDF बनाने के लिए, WITH SCHEMABINDING . का उपयोग करें फ़ंक्शन बनाने के लिए आपके टी-एसक्यूएल कोड में। यह लागू होता है कि फ़ंक्शन एक स्केलर फ़ंक्शन है या तालिका-मूल्यवान फ़ंक्शन (TVF)।

किसी भी मामले में, मैंने इनलाइन टीवीएफ, मल्टी-स्टेटमेंट टीवीएफ और स्केलर फ़ंक्शन के उदाहरण शामिल किए हैं।

उदाहरण 1 - इनलाइन टेबल-वैल्यूड फंक्शन

स्कीमा बाइंडिंग के साथ इनलाइन टीवीएफ बनाने का एक उदाहरण यहां दिया गया है:

CREATE FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) SCHEMABINDINGASRETURN के साथ रिटर्न टेबल (CateId, CatName, dbo से फोन चुनें। CatName =@CatName); जाओ

ध्यान दें कि मैंने अपनी क्वेरी में तालिका को संदर्भित करते समय दो-भाग के नाम का उपयोग किया था (मैंने dbo.Cats का उपयोग किया था तालिका का संदर्भ देते समय, केवल Cats . के बजाय ) ऐसा करना किसी ऑब्जेक्ट को बाध्य करने वाले स्कीमा के लिए एक आवश्यकता है। यदि आप दो-भाग नामों का उपयोग किए बिना किसी ऑब्जेक्ट को स्कीमा बाइंड करने का प्रयास करते हैं तो आपको एक त्रुटि मिलेगी।

अब जब मैंने स्कीमा को अपने फ़ंक्शन के लिए बाध्य कर दिया है, यदि मैं इसकी परिभाषा में संदर्भित तालिका को छोड़ने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है:

DROP TABLE Cats;

परिणाम:

Msg 3729, Level 16, State 1, Line 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' नहीं कर सकता क्योंकि 'कैट्स' नाम स्कीमा बाइंडिंग के लिए अमान्य है। नाम दो-भाग प्रारूप में होने चाहिए और कोई वस्तु स्वयं को संदर्भित नहीं कर सकती है।

उदाहरण 2 - मल्टी-स्टेटमेंट टेबल-वैल्यूड फंक्शन

मल्टी-स्टेटमेंट TVF के साथ, आप WITH SCHEMABINDING . डालते हैं वापसी चर विनिर्देश के बाद।

CREATE FUNCTION dbo.udf_PetsByName_MSTVF(@PetName varchar(70)) SCHEMABINDINGASBEGIN INSERT INTO @pets SELECT', ',C ), CatName FROM dbo.Cats जहां CatName =@PetName; INSERT INTO @pets सेलेक्ट CONCAT ('डॉग', '', डॉगआईड), डॉगनाम फ्रॉम dbo.Dogs जहां डॉगनाम =@ पेटनाम; IF @@ ROWCOUNT =0 @pets VALUES में सम्मिलित करें ( '', 'उस नाम के कोई पालतू जानवर नहीं हैं।') END RETURN;END;GO

उदाहरण 3 - स्केलर फ़ंक्शन

यहाँ एक अदिश फ़ंक्शन का उदाहरण दिया गया है:

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int) SCHEMABINDINGAS BEGIN DECLARE @AlbumCount int; dbo.Albums से @AlbumCount =COUNT (AlbumId) चुनें जहां कलाकार आईडी =@ArtistId; वापसी @AlbumCount;END;GO

उदाहरण 4 - अनेक तर्क जोड़ना

आप अल्पविराम से अलग की गई सूची के रूप में एकाधिक तर्क निर्दिष्ट कर सकते हैं। उदाहरण के लिए, यदि आप स्कीमा बाइंडिंग और निर्दिष्ट करना चाहते हैं एन्क्रिप्शन, तो आपको इन्हें अल्पविराम से अलग की गई सूची के रूप में जोड़ना होगा।

CREATE FUNCTION dbo.udf_CatsByName_ITVF(@CatName varchar(70) ) SCHEMABINDING, ENCRYPTIONASRETURN के साथ तालिका लौटाता है ( CatId, CatName, dbo से फोन चुनें। 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक कॉलम बदलना:शून्य से शून्य नहीं

  2. 2017 से पहले SQL सर्वर के लिए String_agg

  3. Sql सर्वर अस्थायी तालिका गायब हो जाती है

  4. यूएस पोस्टल (ज़िप) कोड के लिए बाउंडिंग निर्देशांक कैसे प्राप्त करें?

  5. SQL सर्वर 2017 में नई सुविधाएँ (डेटाबेस इंजन)