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

SQL सर्वर में एक मल्टी-स्टेटमेंट टेबल-वैल्यूड फंक्शन (MSTVF) बनाएं

आप T-SQL CREATE FUNCTION का उपयोग करके SQL सर्वर में एक मल्टी-स्टेटमेंट टेबल-वैल्यू फंक्शन (MSTVF) बना सकते हैं। वाक्य रचना।

सिंटैक्स

यहां मल्टी-स्टेटमेंट टीवीएफ के लिए आधिकारिक सिंटैक्स दिया गया है।

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

उदाहरण 1 - बेसिक MSTVF

यहां एक बहु-कथन तालिका-मूल्यवान फ़ंक्शन का एक उदाहरण दिया गया है।

CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName;

    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @pets
        VALUES (
            '',
            'There are no pets of that name.'
            )
    END

    RETURN;
END;

GO

जब मैं @pets . निर्दिष्ट करता हूं तो वापसी तालिका की संरचना शुरुआत में परिभाषित होती है चर। क्वेरी परिणाम @pets . में डाले जाते हैं चर।

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

उदाहरण 2 - स्कीमा बाइंडिंग जोड़ें

आमतौर पर SCHEMABINDING . का उपयोग करके अपने कार्यों को स्कीमा बाँधना एक अच्छा विचार है बहस।

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

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

यहाँ वही फ़ंक्शन है, लेकिन इस बार स्कीमा बाइंडिंग के साथ:

CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
    WITH SCHEMABINDING
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName;

    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @pets
        VALUES (
            '',
            'There are no pets of that name.'
            )
    END

    RETURN;
END;

GO

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

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

DROP TABLE Dogs;

परिणाम:

Msg 3729, Level 16, State 1, Line 1
Cannot DROP TABLE 'Dogs' because it is being referenced by object 'udf_PetsByName_MSTVF'.

वैसे, अगर मैं दो-भाग के नामकरण का उपयोग किए बिना फ़ंक्शन बनाने का प्रयास करता हूं, तो यहां क्या होता है:

CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
    WITH SCHEMABINDING
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM Dogs
    WHERE DogName = @PetName;

    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @pets
        VALUES (
            '',
            'There are no pets of that name.'
            )
    END

    RETURN;
END;

GO

परिणाम:

Msg 4512, Level 16, State 3, Procedure udf_PetsByName_MSTVF, Line 10
Cannot schema bind table valued function 'dbo.udf_PetsByName_MSTVF' because name 'Cats' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.

उदाहरण 3 - एन्क्रिप्शन जोड़ें

आप ENCRYPTION . का उपयोग करके अपने कार्यों को एन्क्रिप्ट भी कर सकते हैं बहस।

यहां फ़ंक्शन को एन्क्रिप्ट करने का एक उदाहरण दिया गया है:

CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
    WITH SCHEMABINDING, ENCRYPTION
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName;

    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @pets
        VALUES (
            '',
            'There are no pets of that name.'
            )
    END

    RETURN;
END;

GO

अब मैं फ़ंक्शन की परिभाषा नहीं देख पा रहा हूँ।

SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_PetsByName_MSTVF');

परिणाम:

+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

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

No script was returned when scripting as Create on object UserDefinedFunction

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GETUTCDATE () SQL सर्वर में उदाहरण (T-SQL)

  2. SQL सर्वर से कनेक्ट करने के लिए PHP का उपयोग कैसे करें

  3. SQL सर्वर में किसी तालिका के लिए सभी जाँच और विदेशी कुंजी बाधाओं को कैसे सक्षम करें (T-SQL उदाहरण)

  4. जहां क्लॉज में स्ट्रिंग्स की सूची बनाने के लिए अल्पविराम से अलग किए गए स्ट्रिंग को पार्स करें

  5. पहले से मौजूद तालिका के लिए कॉलम पर अद्वितीय बाधा कैसे बनाएं - SQL सर्वर / TSQL ट्यूटोरियल भाग 97