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