Как создать функцию SQL Server для возврата int? - PullRequest
8 голосов
/ 07 июня 2011

Я пытаюсь создать функцию 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

Ответы [ 4 ]

10 голосов
/ 07 июня 2011

Вы не предоставляете имя переменной для возвращаемого значения, только ее тип, и парены не нужны;

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

RETURNS int
AS
....

Также;

select Data from @fieldName

Не будет работатьвам потребуется динамический SQL для выбора объекта, имя которого находится в переменной.

0 голосов
/ 07 июня 2011

для справки, это полная функция, реализованная с предложениями Алекса К

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
0 голосов
/ 07 июня 2011

Я пытаюсь создать функцию SQL который проверяет, запускается ли параметр с определенным сроком или содержит термин, но не начинается с него.

Я предполагаю следующее:

  • @fieldName на самом деле является именем таблицы (судя по вашим попыткам использования).
  • @searchterm - это термин, который вы ищете
  • Data - столбец в таблице @fieldName

Если что-то из перечисленного неверно, этот ответ бесполезен.

Вам нужно будет использовать динамический sql, поскольку таблица в запросе выбора не может быть параметризована. Вам понадобятся 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 голосов
/ 07 июня 2011

Здесь есть несколько проблем.Я добавил комментарии к коду ниже:

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))

    --@fieldname 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

Это должно немного приблизить вас к тому, что вы пытаетесь достичь.

...