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

SQL सर्वर में एक अदिश उपयोगकर्ता-परिभाषित फ़ंक्शन बनाएँ

SQL सर्वर में, आप CREATE FUNCTION का उपयोग करके एक अदिश उपयोगकर्ता-परिभाषित फ़ंक्शन बना सकते हैं बयान। एक स्केलर यूज़र-डिफ़ाइंड फ़ंक्शन, जिसे अन्यथा स्केलर यूडीएफ के रूप में जाना जाता है, एक यूज़र-डिफ़ाइंड फ़ंक्शन है जो एक एकल मान देता है।

इस लेख में कुछ बुनियादी टी-एसक्यूएल स्केलर यूडीएफ बनाने के उदाहरण हैं।

सिंटैक्स

सबसे पहले, आइए स्केलर यूडीएफ बनाने के लिए सिंटैक्स को देखें।

टी-एसक्यूएल स्केलर यूडीएफ के लिए वाक्य रचना इस प्रकार है:

 
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS return_data_type  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN scalar_expression  
    END  
[ ; ]

और सीएलआर स्केलर यूडीएफ के लिए वाक्य रचना:

 
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type   
    [ = default ] }   
    [ ,...n ]  
)  
RETURNS { return_data_type }  
    [ WITH <clr_function_option> [ ,...n ] ]  
    [ AS ] EXTERNAL NAME   
[ ; ]  

<function_option> . पर भागों टी-एसक्यूएल फ़ंक्शन और <clr_function_option> . के लिए सीएलआर कार्यों के लिए आप यूडीएफ के लिए विकल्प निर्दिष्ट कर सकते हैं। फ़ंक्शन विकल्पों में एन्क्रिप्शन, स्कीमा बाइंडिंग, एक EXECUTE AS . जोड़ना शामिल है खंड, साथ ही यह निर्दिष्ट करना कि जब कोई NULL मान तर्क के रूप में पारित किया जाता है तो क्या करना है।

तर्कों और फ़ंक्शन विकल्पों की पूरी सूची Microsoft वेबसाइट पर पाई जा सकती है।

Microsoft दस्तावेज़ में बहुत अधिक विवरण शामिल हैं, इसलिए निम्न उदाहरण स्केलर UDF बनाते समय कुछ सामान्य अवधारणाओं और विकल्पों का त्वरित अवलोकन प्रदान करने के उद्देश्य से हैं।

उदाहरण 1 - बेसिक स्केलर UDF

यहां एक उदाहरण दिया गया है जो कोड एक बुनियादी टी-एसक्यूएल स्केलर यूडीएफ बनाने के लिए उपयोग किया जाता है।

CREATE FUNCTION dbo.ufn_discountPrice( 
    @price DECIMAL(12,2), 
    @discount DECIMAL(12,2) 
    ) 
RETURNS DECIMAL (12,2)
AS
BEGIN
  RETURN @price * (1 - @discount);
END;

यह अदिश UDF दो मापदंडों को स्वीकार करता है; @price और @discount . जब भी फ़ंक्शन का आह्वान किया जाता है तो इन्हें फ़ंक्शन में तर्क के रूप में पास किया जाता है। फ़ंक्शन उन तर्कों का मान लेता है, उन मानों का उपयोग करके गणना करता है, फिर परिणामी मान देता है। इस मामले में, रियायती मूल्य वापस कर दिया जाता है।

उदाहरण 2 - UDF को आमंत्रित करें

एक बार यूडीएफ बन जाने के बाद, जब भी आपको इसकी आवश्यकता हो, इसे टी-एसक्यूएल कोड के भीतर लागू किया जा सकता है।

यूडीएफ को लागू करने का एक उदाहरण यहां दिया गया है:

SELECT dbo.ufn_discountPrice(100, .2) AS Result;

परिणाम

+----------+
| Result   |
|----------|
| 80.00    |
+----------+

उदाहरण 3 - एक तालिका की क्वेरी करना

स्केलर यूडीएफ क्वेरी डेटाबेस टेबल जैसी चीजें भी कर सकते हैं।

यहां एक है जो किसी दिए गए कलाकार के लिए डेटाबेस में एल्बमों की संख्या देता है।

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

यह एक अदिश फलन है क्योंकि यह एकल मान लौटाता है। यदि हम एल्बमों की एक सूची वापस करना चाहते हैं, तो हमें तालिका-मूल्यवान फ़ंक्शन का उपयोग करने की आवश्यकता होगी, क्योंकि तालिका-मूल्यवान फ़ंक्शन इसके परिणाम पंक्तियों के एक सेट के रूप में लौटाते हैं।

उदाहरण 4 - स्कीमा बाइंडिंग

जब आप एक उपयोगकर्ता-परिभाषित फ़ंक्शन बनाते हैं जो डेटाबेस में अन्य वस्तुओं पर निर्भर करता है, तो आमतौर पर स्कीमा को यूडीएफ से बांधना एक अच्छा विचार है। यूडीएफ को बाध्य करने वाली स्कीमा यह सुनिश्चित करती है कि अंतर्निहित वस्तुओं में कोई परिवर्तन नहीं किया जा सकता है जो संभावित रूप से कार्य को प्रभावित कर सकता है।

उदाहरण के लिए, आप उस तालिका को छोड़ने में सक्षम नहीं होंगे जो एक स्कीमा बाध्य यूडीएफ अपनी परिभाषा में उपयोग करता है।

स्कीमा को यूडीएफ बाँधने के लिए, WITH SCHEMABINDING का उपयोग करें इसकी परिभाषा में। यूडीएफ में संदर्भित किसी भी ऑब्जेक्ट के लिए आपको दो-भाग नामों का उपयोग करने की भी आवश्यकता है।

यहां पिछले उदाहरण को फिर से लिखा गया है ताकि यह स्कीमा बाध्य हो:

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH SCHEMABINDING
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

इसलिए, मैंने पहले उदाहरण से दो चीजें बदल दीं। मैंने WITH SCHEMABINDING added जोड़ा , और मैंने Albums . बदल दिया करने के लिए dbo.Albums

अब यदि कोई उस तालिका को छोड़ने या उसमें अन्य परिवर्तन करने का प्रयास करता है, तो उन्हें एक त्रुटि प्राप्त होगी।

उदाहरण 5 - एन्क्रिप्शन

आप WITH ENCRYPTION का भी उपयोग कर सकते हैं फ़ंक्शन को एन्क्रिप्ट करने के लिए।

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH ENCRYPTION
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

उदाहरण 6 - NULL इनपुट

फ़ंक्शन का आह्वान करते समय, यदि कोई तर्क NULL है, तो फ़ंक्शन का शरीर अभी भी निष्पादित होता है। यानी, जब तक कि आपने स्पष्ट रूप से RETURNS NULL ON NULL INPUT stated न कहा हो फ़ंक्शन की परिभाषा में।

यदि कोई भी तर्क NULL है, तो उस विकल्प को निर्दिष्ट करने पर NULL वापस आ जाएगा।

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH RETURNS NULL ON NULL INPUT
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

जब मैं तर्क के रूप में NULL का उपयोग करके फ़ंक्शन का आह्वान करता हूं:

SELECT dbo.ufn_CountAlbums(NULL) AS Result;

मैंने इस विकल्प के लिए जो निर्दिष्ट किया है, उसके आधार पर मुझे एक अलग परिणाम मिलता है।

जब फ़ंक्शन डिफ़ॉल्ट सेटिंग का उपयोग करता है तो परिणाम यहां दिया गया है (CALLED ON NULL INPUT ):

+----------+
| Result   |
|----------|
| 0        |
+----------+

और यहां परिणाम है जब यह RETURNS NULL ON NULL INPUT का उपयोग करता है :

+----------+
| Result   |
|----------|
| NULL     |
+----------+

उदाहरण 7 - एकाधिक विकल्प

आप कई विकल्पों को अल्पविराम से अलग कर सकते हैं।

यहां एक उदाहरण दिया गया है जो एन्क्रिप्शन और स्कीमा बाइंडिंग दोनों को फ़ंक्शन में जोड़ता है:

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH ENCRYPTION, SCHEMABINDING
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

उदाहरण 8 - एक फ़ंक्शन बदलें

आप CREATE . को बदलकर एक अदिश UDF को बदल सकते हैं ALTER . के साथ ।

ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH SCHEMABINDING
AS  
BEGIN  
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

  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 सर्वर में किसी बड़ी तालिका में आप NOT NULL कॉलम कैसे जोड़ते हैं?

  2. क्या गणना() में शर्त निर्दिष्ट करना संभव है?

  3. टी-एसक्यूएल स्किप टेक स्टोर्ड प्रोसीजर

  4. डेटाबेस तालिका से वर्ग उत्पन्न करें

  5. परिणाम प्रदर्शित किए बिना SQL क्वेरी कैसे निष्पादित करें