36


7

SQL2005で問題なく動作するクエリがありますが、データベースをSQL2008に移動すると、タイトルからエラーが発生します。

問題のコードは、空のパラメータを指定したCONTAINS、CONTAINSTABLE、またはFREETEXTの呼び出しです。 しかし、私はそのような価値があるときだけ電話をかけたり、参加しようとしています

ここで(@search_term = ''または(FREETEXT(lst.search_text、@search_term))))

または

l.listing_id = ftb。[key]およびlen(@search_term)> 0の場合は、左からコンテインステイブル(listing_search_text、search_text、@ search_term)ftb

しかし、SQL2008でこれを機能させるための回避策はありません。 何か案は?

動的SQLを実行することも、2つの異なるケース(if joinを使用して選択する、FT joinを使用しないで選択)を持つifステートメントを使用できることもわかっています。 これを行う必要がない何かもっと良い回避策はありますか?

4 Answer


53


私は自分のデータベースをSQL 2005からSQL 2008に変換したときに、今日この問題に対する答えを見つけました。

検索語句に "" "を渡し、@search_term =" "テストを" @search_term = ""に変更します。SQLサーバーは二重引用符を無視し、エラーをスローしません。

たとえば、次は実際にUsersテーブルのすべてのレコードを返します。

declare  @SearchTerm nvarchar(250)

SET @SearchTerm = '""'

select UserId, U.Description, U.UserName
from dbo.Users U
WHERE ((@SearchTerm = '""') OR CONTAINS( (U.Description, U.UserName), @SearchTerm))

あなたが.Netを使っているなら、あなたはEのコピーをつかむかもしれません。 W. BachtalのFullTextSearchクラス。 彼のサイトは非常に有益です:http://ewbi.blogs.com/develops/


14


この解決策はSQL 2008ではうまくいきませんでした。 答えはかなり明確に見え、便利だと思われましたが、2Mレコードのテーブルではタイムアウトになります。 実際には、SSMSでクエリを実行しているサーバーをロックしました。

where句のORが気に入らないようですが、条件を区切ってクエリを実行できます。

回避策としてUNIONを使用しました。

@SearchTermを宣言するnvarchar(250)

SET @SearchTerm = '""'

dbo.Users U WHEREからUserId、U.Description、U.UserNameを選択します((@SearchTerm = '""')。

連合

dbo.Users UからUserId、U.Description、U.UserNameを選択します((U.Description、U.UserName)、@SearchTerm))。


2


*二重引用符を追加するだけ*空文字列をチェックしてから二重引用符を追加することができます。

@search_term = ''、 '""' 'の場合は@search_term = case、それ以外の場合は@Address Endを設定します。

どうぞ -

ここで(@search_term = '""'または(FREETEXT(lst.search_text、@search_term)))


1


FTSとORオペランドに関する問題は、SP2 CU4で修正されました。 あなたがそのレベルかそれ以降であれば、OR条件はUNIONする必要なしにうまく動くはずです。 私たちはSP2 CU8のごく最近のアップデートを試みました、そして、FTSは現在ORで動作します。 また、以前は失敗していた3.12のような検索でも、今では問題なく動作します。