あなたの好きな文字列は、1文字の単語にのみ一致します。これが必要な場合は、次のようにまとめることができます。
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 アセンブリを作成し、これをデータベースに読み込む必要があります。.NET コードで注釈を使用しIsDeterministic
、カスタム アセンブリを SQL Server にロードする必要がありますwith permission_set = safe
。これにより、関数の並列性が確保され、計算列などの場所で使用できるようになります。
SQL Server は .NET コードの実行に非常に優れています。つまり、パフォーマンスが非常に高くなります。必要なものを正規表現で書くのはとても簡単です。
全文検索に関しては、contains() は基本的に全文述語であり、使用するには SQL Server でこれを有効にする必要があります。near() は、contains() 述語内で使用されます。これは、サポートされている機能 (あいまい一致のために単語の語形変化を行う) と、それを使用するために有効にする必要があるもの (追加の Windows サービスを実行する) の両方の点で、あなたがやりたいことに対してかさばると思います。