1

クライアントの1人を含むプロジェクトの一部は、UIに対応するヘブライ語1037(データベースは英語とヘブライ語の両方を持っています) AngularとC#で書かれたシステム。データベース自体はLatin1_General_100_CI_ASに照合されます。 ストアドプロシージャは、単一ワード入力を取得すると想定される検索用のパラメータを取得し、SP内のコードは、異なる全文検索クエリに対してそのパラメータを使用します。関連するデータが存在するにもかかわらず、全文検索ストアドプロシージャに結果が得られません

最初に奇妙なことが起こるのは、引用符を付けてもしなくても文字列を渡すと、すべて正常に動作します。私はこれが既知のバグであり、マイクロソフトはすぐに修正するつもりはないと読んでいます。

本当の問題は、渡された実際の文字列にあります。

ヘブライ文字列または数値を渡すと、すべて正常に動作し、SQL Serverは関連するデータを取得します(UIとSSMSを通じて)。

英語で文字列をSSMSに渡すと、SQL Serverは関連するデータで応答しますが、UIシステムがパラメータを渡すとデータが返されません。私は非常に問題のいくつかの助けに感謝します

ALTER PROCEDURE dbo.SearchByFreeText 
@StringToSearch NVARCHAR(500) = NULL 

AS 

SELECT * 
FROM SampleTable 
WHERE CONTAINS(SampleColumn, @StringToSearch) 
OR 
FREETEXT(SampleColumn, @StringToSearch) 

次のSQLコードは非常に基本的である使用してコードイムです。

ありがとうございます!

答えて

0

は切り抜い下に理解しよう:

  1. SELECT *フリーテキスト(説明、 "SQLのMGT")

    コンテンツから、これは文字列「SQLを検索するように見えるが、 MGT "では、実際には" SQL "または" MGT "を検索します。

  2. SELECT * FROMコンテンツ(説明、 '偉大NT NEAR')

    を含む場合の説明欄にこの検索は "NT" は "素晴らしい" の近くにあるすべての行を検索します。

0

CONTAINSまたはFREETEXTを呼び出すときに、language_termを明示的に設定してみてください。ドキュメントから:

CONTAINS (... [ , LANGUAGE language_term ]) 

language_termクエリの一部として単語分割、ステミング、シソーラスの拡張や交換、およびノイズワード(またはストップワード)を除去するために使用する言語です。

language_termは、言語のLCIDに対応する文字列、整数、または16進値として指定できます。 language_termが指定されている場合、それが表す言語は検索条件のすべての要素に適用されます。 値が指定されていない場合、列のフルテキスト言語はが使用されます。

FTSの言語の不一致があり、SSMSでクエリを実行するときにSSMSが何らかの形で正しいものを判断するように見えます。

したがって、UIから英語の文字列を渡すと、おそらくヘブライ語のインデックスに対してSQL Serverがチェックしようとします。ない最終的な解決策としてではなく、SQLクエリにハードコードに英語の言語コード(1033)を試してみて、何が発見されるかどうかを確認するためにUIから英語の検索語を渡す:

SELECT * 
FROM SampleTable 
WHERE CONTAINS(SampleColumn, @StringToSearch, LANGUAGE 1033) 
OR 
FREETEXT(SampleColumn, @StringToSearch, LANGUAGE 1033) 

それが結果を見つけない場合、あなたはおそらく意志その場で検索用語の言語を決定し、動的SQLまたはIF (@lang = 1033)ブロックを使用して正しいLANGUAGEパラメータを有効にする必要があります。

HTH

関連する問題