2011-06-07 135 views
6

我正在嘗試創建一個SQL函數,用於測試參數是以某個術語開頭還是包含術語,但不以它開頭。如何創建一個SQL Server函數來返回一個int?

基本上,如果參數與術語開始,該函數返回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 2011-06-07 11:33:13

回答

9

您不提供返回值的變量名稱,只是它的類型,並且不需要parens;

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

我試圖創建一個SQL函數 測試一個參數是否開始 有一定期限或包含 期限,但不會開始使用它。

林假設如下:

  • @fieldName,其實是一個表名(由您嘗試使用判斷)。
  • @searchterm是你要找的
  • Data術語是在表中的列@fieldName

如果上述任何不正確,這個答案是嘶 - 無用的。

您將需要使用動態sql,因爲select查詢中的表不能被參數化。你將需要2個不同版本的動態SQL,因爲你想檢查「開始」和更一般的「包含」。您需要動態sql中的輸出變量才能確定調用的結果。

作爲一個幫助,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 
相關問題