2011-06-07 17 views
6

मैं एक एसक्यूएल फ़ंक्शन बनाने की कोशिश कर रहा हूं जो परीक्षण करता है कि कोई पैरामीटर किसी निश्चित अवधि से शुरू होता है या इसमें शब्द होता है, लेकिन इसके साथ प्रारंभ नहीं होता है।मैं int को वापस करने के लिए SQL सर्वर फ़ंक्शन कैसे बना सकता हूं?

असल में, यदि पैरामीटर अवधि के साथ शुरू होता है, फ़ंक्शन एक 0. अन्यथा यह रिटर्न एक 1.

यह मेरे पास है कि समारोह की हड्डियों, जो मैं दूसरे से अनुकूल करने के लिए कोशिश कर रहा हूँ है समारोह मैंने पाया:

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 

RETURNS @value int -- this is showing an error, it seems to expect table but all I want is an int 
(
    -- does this need to be here? If so, what should it be? 
) 

AS 

BEGIN 

    declare @field TABLE(Data nvarchar(50)) 

    insert into @field 
     select Data from @fieldName 

    if (Data like @searchTerm + '%') -- starts with 
    begin  
     return 0 
    end 
    else if (Data like '%' + @searchTerm + '%' and Data not like @searchTerm + '%') -- contains, but doesn't start with 
    begin  
     return 1 
    end 

END 

GO 
+0

ऐसा लगता है आप वापस जाने के लिए 'BIT' (बुलियन) नहीं' INT' कोशिश कर रहे हैं की तरह है।यद्यपि एक तीसरा राज्य है जिसे आप वर्तमान में संभालने में नहीं हैं; शुरू नहीं होता है और इसमें 'searchTerm' नहीं होता है। – Jamiec

उत्तर

9

आप वापसी मान के लिए एक चर नाम प्रदान नहीं करते हैं, बस इसके प्रकार, और कोष्ठक की जरूरत नहीं कर रहे हैं;

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 

RETURNS int 
AS 
.... 

इसके अलावा;

select Data from @fieldName 

काम नहीं करेगा, आप dynamic SQL जरूरत है एक वस्तु जिसका नाम एक चर में है से चयन करने के लिए होगा।

0

यहां कुछ समस्याएं हैं। मैंने नीचे दिए गए कोड पर टिप्पणियां जोड़ दी हैं:

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 

RETURNS @value int --Returning an int is fine, but you don't need the @value variable 
(
    --This isn't required (unless you're returning a table) 
) 

AS 

BEGIN 

    declare @field TABLE(Data nvarchar(50)) 

    [email protected] is a varchar, not a table (is this where your error is coming from).  
    --If @fieldname is the name of a table you're going to need to exec a sql string and concat @fieldname into the string 
    insert into @field 
     select Data from @fieldName 

    --You need a variable to contain the value from Data 
    --(ie declare @Data and select @Data = Data) 
    if (Data like @searchTerm + '%') -- starts with 
    begin  
     return 0 
    end 
    else if (Data like '%' + @searchTerm + '%' and Data not like @searchTerm + '%') -- contains, but doesn't start with 
    begin  
     return 1 
    end 

END 

यह आपको जो कुछ भी करने की कोशिश कर रहा है उसके करीब थोड़ा सा होना चाहिए।

0

मैं एक एसक्यूएल समारोह कि परीक्षण है कि क्या एक पैरामीटर एक निश्चित अवधि के साथ शुरू होता है या शब्द मौजूद है बनाने के लिए कोशिश कर रहा हूँ, लेकिन यह साथ शुरू नहीं करता है।

इम निम्नलिखित संभालने:

  • @fieldName (अपने प्रयास किया उपयोग द्वारा पहचानने) एक तालिका नाम वास्तव में है।
  • @searchterm अवधि आप के लिए
  • Data देख रहे है तालिका में किसी स्तंभ @fieldName

उपरोक्त में से किसी गलत हैं, तो क्या यह उत्तर पड़ोसियों पर बेकार है।

आपको गतिशील एसक्यूएल का उपयोग करने की आवश्यकता होगी क्योंकि एक चयनित क्वेरी में तालिका को पैरामीटर नहीं किया जा सकता है। आपको डायनामिक एसक्यूएल के 2 अलग-अलग संस्करणों की आवश्यकता होगी क्योंकि आप "साथ शुरू होते हैं" और अधिक सामान्य "शामिल" की जांच करना चाहते हैं। कॉल के परिणाम निर्धारित करने के लिए आपको गतिशील एसक्यूएल से आउटपुट वैरिएबल की आवश्यकता होगी।

एक सहायता के रूप में, INT आकार के मामले में कुल ओवरकिल है। यदि आपके पास केवल 2 राज्य हैं (जो मुझे संदेह है) तो आप BIT चाहते हैं, यदि आपके पास 3 राज्य हैं (जैसा कि मुझे संदेह है) तो आप TINYINT चाहते हैं। मैं अब आपके मूल उदाहरण के करीब रहने के लिए int के साथ रहूंगा, लेकिन इसे बदलने पर विचार करें।

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 
RETURNS INT 
AS 
BEGIN 

    DECLARE @startsWithResult INT, 
      @containsResult INT 
    DECLARE @startsWithSQL NVARCHAR(MAX) = N'SELECT @result=1 FROM ' + @fieldName + ' WHERE Data LIKE '' + @searchTerm + '%''' 
    DECLARE @containsSQL NVARCHAR(MAX) = N'SELECT @result=1 FROM ' + @fieldName + ' WHERE Data LIKE ''%' + @searchTerm + '%''' 

    EXEC sp_ExecuteSQL @startsWithSQL, N'@result int output', @result = @startsWithResult OUTPUT 

    IF @startsWithResult = 1 
    RETURN 0 

    EXEC sp_ExecuteSQL @containsSQL, N'@result int output', @result = @containsResult OUTPUT 

    IF @containsResult = 1 
    RETURN 1 

END 
0
संदर्भ के लिए

, यह पूरा समारोह एलेक्स कश्मीर से सुझाव के साथ लागू के रूप में

CREATE FUNCTION [dbo].[fnGetRelevance] 
( 
    @fieldName nvarchar(50), 
    @searchTerm nvarchar(50) 
) 

RETURNS int 
AS 
BEGIN 
    if (@fieldName like @searchTerm + '%') -- starts with 
    begin  
     return 0 
    end 
    else if ((@fieldName like '%' + @searchTerm + '%') and (@fieldName not like @searchTerm + '%')) -- contains, but doesn't start with 
    begin  
     return 1 
    end 

    return 1 
END 

GO 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^