我不知道这是否是解决您的问题的最有效方法,但想到的一个想法是将输入字符串拆分为表值函数的逻辑封装。
调用函数并将结果存储到表变量中。
遍历表变量并将拆分的字符串连接成您将用于搜索的最终字符串。
我没有在此处包含函数的代码(为简洁起见),但在我的情况下,我的函数接受要拆分的字符串和拆分字符串的分隔符,并返回具有以下结构的表: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))