Я не знаю, будет ли это наиболее эффективным подходом к вашей проблеме, но одна мысль, которая приходит в голову, заключается в инкапсуляции логики для разбиения входной строки в табличную функцию.
Вызовите функцию и сохраните результаты в табличной переменной.
Переберите переменную таблицы и объедините разделенные строки в последнюю строку, которую вы будете использовать для поиска.
Я не включил здесь код функции (для краткости), но в моем случае моя функция принимает строку для разделения и разделитель для строки и возвращает таблицу со следующей структурой: Position INT, Value VARCHAR(8000)
Если у вас есть функция на месте, вы можете включить ее следующим образом:
SET NOCOUNT ON
DECLARE @sampleString VARCHAR(500)
SET @sampleString = 'Jon Sidnell Rocks'
DECLARE @delimiter VARCHAR(20);
SET @delimiter = ' '
DECLARE @SplitResults TABLE (
POSITION INT,
VALUE VARCHAR(8000),
fUsed BIT DEFAULT 0)
INSERT INTO @SplitResults ( POSITION, VALUE )
SELECT * FROM dbo.ufn_SplitString(@sampleString, @delimiter)
--Set up a simple loop instead of having to open up a cursor
DECLARE @Value VARCHAR(8000);
DECLARE @Position INT;
SELECT @Value = q.VALUE, @Position = q.Position
FROM (SELECT TOP 1 VALUE, Position FROM @SplitResults WHERE fUsed = 0)q
DECLARE @SearchString VARCHAR(8000)
WHILE @@ROWCOUNT <> 0 AND @Value IS NOT NULL
BEGIN
IF @Position = 1
BEGIN
SET @SearchString = '("' + @Value + '*" OR FORMSOF(THESAURUS, '+ @Value +') OR FORMSOF(INFLECTIONAL, ' + @Value + '))'
END
ELSE
BEGIN
SET @SearchString = @SearchString + ' OR ("' + @Value + '*" OR FORMSOF(THESAURUS, '+ @Value +') OR FORMSOF(INFLECTIONAL, ' + @Value + '))'
END
--Update record so we know we used it
UPDATE @SplitResults SET fUsed = 1
WHERE Position = @Position AND VALUE = @Value
--Get Next Value to Work With
SELECT @Value = q.VALUE, @Position = q.Position
FROM (SELECT TOP 1 VALUE, Position FROM @SplitResults WHERE fUsed = 0)q
END
PRINT @SearchString;
SET NOCOUNT OFF;
Вывод должен выглядеть примерно так:
("Jon*" OR FORMSOF(THESAURUS, Jon) OR FORMSOF(INFLECTIONAL, Jon)) OR ("Sidnell*" OR FORMSOF(THESAURUS, Sidnell) OR FORMSOF(INFLECTIONAL, Sidnell)) OR ("Rocks*" OR FORMSOF(THESAURUS, Rocks) OR FORMSOF(INFLECTIONAL, Rocks))