अगर मैं कभी भी 'As' के बाद 'Begin' जोड़ता हूं तो यह गलत सिंटैक्स कहता है। यह ठीक काम करता है अगर मैं एक मान वापस करने की कोशिश कर रहा हूं।

इसके बजाय मुझे 'के रूप में' और खुले कोष्ठक () के बाद 'वापसी' जोड़ना चाहिए

ऐसा क्यों है?

रिटर्न के रूप में एक मान के साथ, मैं इसे ठीक कर सकता हूं:

 CREATE FUNCTION MATHEE(@A int,@B int)
 returns int
 as 
 begin
    DECLARE @C int

    SET @C = @A + @B

 return @C 
 end

तालिका के साथ रिटर्न के रूप में, मैं नहीं कर सकता:

   CREATE FUNCTION TOP_USERSs(@number int,@bob varchar(20))
RETURNS TABLE 
AS
BEGIN

RETURN SELECT agent from Agents where agent = @bob and prime > @number
END

यह कहता है:

'BEGIN' के पास गलत सिंटैक्स।

यह कोष्ठक का उपयोग करके और बिना start..end के ठीक काम करता है:

CREATE FUNCTION TOP_USERSs(@number int,@bob varchar(20))
RETURNS TABLE 
AS
RETURN
(
 SELECT agent from Agents where agent = @bob and prime > @number
)
2
Da black ninja 5 जून 2017, 16:02
3
आपको असफल एसक्यूएल दिखाने की जरूरत है।
 – 
Alex K.
5 जून 2017, 16:03
@एलेक्सके। जोड़ा गया। मैंने इन उदाहरणों को यह मानते हुए किया कि एक मान या पूरी तालिका वापस करने के लिए दोनों वाक्यविन्यास समान हैं।
 – 
Da black ninja
5 जून 2017, 16:05

4 जवाब

सबसे बढ़िया उत्तर

RETURNS TABLE एक इनलाइन यूजर-डिफाइंड फंक्शन में और इनमें फंक्शन बॉडी नहीं होती है

BEGIN और END द्वारा सीमित कोई function_body नहीं है।

उदाहरण के लिए यदि आपने RETURN से पहले set @number += 1 जोड़ा है तो यह भी पार्स करने में विफल होगा।

6
Alex K. 5 जून 2017, 16:16

RETURNS TABLE एक इनलाइन तालिका-मूल्यवान फ़ंक्शन बनाता है। इसके शरीर के रूप में एक एकल select को return में लपेटा जाना चाहिए था:

CREATE FUNCTION TOP_USERSs(@number int,@bob varchar(20))
returns table
as return (
    select ...
);

यदि आप स्टार्ट-एंड सिंटैक्स चाहते हैं, तो यह एक बहु-कथन तालिका-मूल्यवान फ़ंक्शन है, और फिर आपको उस तालिका को घोषित करने की आवश्यकता होगी जो वह लौटाती है:

CREATE FUNCTION TOP_USERSs(@number int,@bob varchar(20))
returns @result table (agent varchar(10) not null)
as
begin
    insert into @result (agent) ... ;
    ...
    return;
end;
5
GSerg 5 जून 2017, 16:15
दूसरी क्वेरी में वापसी 'रिटर्न @result' का उल्लेख किए बिना तालिका को स्वचालित रूप से वापस कर देगी?
 – 
Da black ninja
5 जून 2017, 16:22
1
अनुबंध यह है कि लौटाया गया डेटा फ़ंक्शन से बाहर निकलने के बिंदु पर @result में निहित है। Return केवल निकास करता है।
 – 
GSerg
5 जून 2017, 16:56

प्रति दस्तावेज़ीकरण, अलग-अलग सिंटैक्स के साथ दो प्रकार के टेबल-वैल्यू फंक्शन होते हैं:

-- Transact-SQL Inline Table-Valued Function Syntax   
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 [ ) ]  
[ ; ]  

यह एक इनलाइन TVF है। जैसा कि सिंटैक्स दिखाता है, इसमें केवल एक RETURN और उसके बाद एक SELECT शामिल हो सकता है। न कुछ ज्यादा, न कुछ कम।

-- Transact-SQL Multi-Statement Table-Valued Function Syntax  
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  
[ ; ]

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

0
AakashM 5 जून 2017, 16:19

आप निम्नलिखित कोड के रूप में वापसी तालिका के क्षेत्रों की घोषणा कर सकते हैं:

CREATE FUNCTION TOP_USERSs(@number int,@bob varchar(20))
RETURNS @Result TABLE ( Agent varchar(20) )
AS
BEGIN
    Insert into @Result 
    SELECT agent from Agents where agent = @bob and prime > @number

    RETURN 
END
1
Mehdi akbari 5 जून 2017, 16:22