你喜欢的字符串只会匹配单个字符的单词。如果这是你需要的,你可以像这样把一些东西放在一起:
declare @str1 varchar(1024) = 'and hello w w w search how are you',
@str2 varchar(1024) = 'and hello w w search how are you',
@likeStr varchar(512),
@pos int,
@maxMatch int;
set @maxMatch = 2;
set @pos = 0;
set @likeStr = '%hello';
while (@pos < @maxMatch)
begin
set @likeStr += ' [^ ]';
set @pos += 1;
end
set @likeStr += ' search%';
select @likeStr, (case when @str1 like @likeStr then 1 else 0 end), (case when @str2 like @likeStr then 1 else 0 end)
如果这不是您需要的,并且您知道单词将包含多少个字符,则可以[a-zA-Z]
在循环中的 like 字符串中使用。
但是,我希望这也不会是您所追求的。然后我的建议是放弃类似的字符串,并转向更复杂的regular expressions
.
不幸的是,您不能将 System.dll 直接加载到 SQL Server 2008 中(我认为这也适用于 SQL Server 2012),因此您需要创建一个自定义的 .NET 程序集并将其加载到您的数据库中。您应该IsDeterministic
在 .NET 代码中使用注释,并将自定义程序集加载到 SQL Serverwith permission_set = safe
中。这应该确保您获得函数的并行性,并且可以在计算列等地方使用它。
SQL Server 非常擅长运行.NET 代码,即它可以非常高效。用正则表达式写出你需要的东西应该很容易。
至于全文搜索, contains() 基本上是一个全文谓词,您必须在 SQL Server 中启用它才能使用它。near() 在 contains() 谓词中使用。我认为这对于您想要做的事情来说是庞大的,无论是就支持的功能(它为模糊匹配做词的变化),以及您需要启用它(运行额外的 Windows 服务)而言。