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

SQL सर्वर में मल्टी-स्टेटमेंट टेबल-वैल्यूड फंक्शन्स और इनलाइन टेबल-वैल्यूड फंक्शन्स के बीच अंतर

जब आप SQL सर्वर में टेबल-वैल्यूड फंक्शन (TVF) बनाते हैं, तो आप इसे या तो इनलाइन टेबल-वैल्यू फंक्शन (ITVF) या मल्टी-स्टेटमेंट टेबल-वैल्यूड फंक्शन (MSTVF) बना सकते हैं। इन फ़ंक्शन प्रकारों के बीच अंतर हैं, और वे तदनुसार एक अलग सिंटैक्स का उपयोग करते हैं।

यह लेख MSTVF और ITVFs के बीच अंतर को कवर करता है।

मतभेद

यहाँ MSTVF और ITVFs के बीच मुख्य अंतर हैं।

<थ>आईटीवीएफ <थ>एमएसटीवीएफ
रिटर्न्स सिंटैक्स आप बस RETURNS TABLE state बताएं और रिटर्न टेबल की परिभाषा फ़ंक्शन के SELECT . पर आधारित होगी बयान। वापसी तालिका की संरचना निर्दिष्ट करने की आवश्यकता नहीं है। आपका RETURNS सिंटैक्स स्पष्ट रूप से रिटर्न टेबल की संरचना को निर्दिष्ट करता है। यह एक तालिका चर घोषित करके किया जाता है जिसका उपयोग फ़ंक्शन के मान के रूप में लौटाई गई पंक्तियों को संग्रहीत और जमा करने के लिए किया जाएगा।
BEGIN/END Syntax ITVFs BEGIN . का उपयोग नहीं करते हैं /END वाक्य रचना। MSTVFs BEGIN . का उपयोग करते हैं /END वाक्य रचना।
प्रदर्शन आम तौर पर MTSVF से तेज़। आम तौर पर ITVFs की तुलना में धीमा।
डेटा अपडेट कुछ मामलों में ITFV का उपयोग करके अंतर्निहित तालिकाओं में डेटा अपडेट करना संभव है। आप MSTVF का उपयोग करके अंतर्निहित तालिकाओं में डेटा अपडेट नहीं कर सकते।

सिंटैक्स

आइए प्रत्येक फ़ंक्शन प्रकार के सिंटैक्स में अंतर देखें।

इनलाइन टेबल-वैल्यूड फंक्शन

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

मल्टी-स्टेटमेंट टेबल-वैल्यूड फंक्शन

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 <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN  
    END  
[ ; ]

ध्यान दें कि MSTVF एक तालिका परिभाषा से शुरू होता है, लेकिन ITVF की ऐसी कोई परिभाषा नहीं है।

MSTVF RETURNS @return_variable TABLE . से शुरू होता है तालिका परिभाषा के बाद। यहां, @return_variable एक तालिका चर है, जिसका उपयोग पंक्तियों को संग्रहीत और संचित करने के लिए किया जाता है जिन्हें फ़ंक्शन के मान के रूप में वापस किया जाना चाहिए।

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

यहाँ एक साधारण ITVF का उदाहरण दिया गया है।

CREATE FUNCTION udf_PetsByName_ITVF( @PetName varchar(70))
    RETURNS TABLE 
AS
RETURN (
    SELECT 
        CONCAT('Cat', ' ', CatId) AS PetId,
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName

    UNION ALL

    SELECT 
        CONCAT('Dog', ' ', DogId) AS PetId,
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName
    );

GO

यहां, मैं UNION ALL . का उपयोग करके दो तालिकाओं में से चयन करता हूं , और फ़ंक्शन केवल परिणाम देता है।

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

यहां एक ही काम करने के लिए MSTVF का उपयोग करने का एक उदाहरण दिया गया है, लेकिन एक अलग तरीके से।

CREATE FUNCTION 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;

    RETURN;
END;

GO

फ़ंक्शन @pets . नामक एक तालिका चर घोषित करने के साथ शुरू होता है . ऐसा करने में, हम वापसी तालिका की संरचना को स्पष्ट रूप से निर्दिष्ट करते हैं।

BEGIN . के अंदर के प्रश्न /END ब्लॉक को @pets . नामक TABLE वैरिएबल में सेव किया जाता है ।

इस मामले में, मैंने UNION ALL . का उपयोग नहीं करना चुना . इसके बजाय, मैंने बयानों को अलग से निष्पादित किया और प्रत्येक के परिणामों को @pets . में सहेजा चर।

उदाहरण 3 - MSTVF में एक और स्टेटमेंट जोड़ें

MSTVF के "मल्टी-स्टेटमेंट" पहलू को और प्रदर्शित करने के लिए, हम उपरोक्त MSTVF में और स्टेटमेंट जोड़ सकते हैं और परिणामों को उसी रिटर्न वेरिएबल में सहेज सकते हैं।

उदाहरण:

CREATE FUNCTION 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

इस मामले में मैंने एक विशेष संदेश वापस करने के लिए कुछ कोड जोड़ा जब भी क्वेरी के परिणामस्वरूप कोई पंक्तियां वापस नहीं आतीं।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संग्रहीत प्रक्रिया जो डेटा को csv फ़ाइलों में निर्यात करती है केवल एक फ़ाइल को निर्यात करती है

  2. ATAN () SQL सर्वर में उदाहरण

  3. SQL सर्वर 2012 से sqlalchemy और pyodbc का उपयोग करके कनेक्ट करना

  4. SQL सर्वर क्वेरी टाइम आउट कहां क्लॉज पर निर्भर करता है

  5. SQL सर्वर में GROUPING और GROUPING_ID फ़ंक्शंस को समझना