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