39

SQL2005 で正常に実行されたクエリがありますが、データベースを SQL2008 に移動すると、タイトルからエラーが発生します。

問題のコードは、空のパラメーターを指定した CONTAINS、CONTAINSTABLE、または FREETEXT の呼び出しです。ただし、そのような値がある場合にのみ呼び出しまたは参加しようとしています

where (@search_term = '' or (FREETEXT(lst.search_text, @search_term)))

また

left join containstable (listing_search_text, search_text,  @search_term) ftb on l.listing_id = ftb.[key] 
    and len(@search_term) > 0

ただし、これが SQL2008 で機能するための回避策が見つかりません。何か案は?

動的 SQL を実行できること、または 2 つの異なるケース (FT 結合を使用して選択する、FT 結合を使用せずに選択する) の if ステートメントを使用できることを知っています。これを行う必要のないより良い回避策はありますか?

4

5 に答える 5

57

今日、自分のデータベースを 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 を使用している場合は、EW Bachtal の FullTextSearch クラスのコピーを取得できます。彼のサイトは非常に有益です: http://ewbi.blogs.com/develops/

于 2008-12-07T04:38:48.583 に答える
14

このソリューションは、SQL 2008 ではうまくいきませんでした。答えはかなり明確に見え、有用であると考えられていましたが、2M レコードを持つテーブルでタイムアウトが発生しました。実際、SSMS でクエリを実行しているだけのサーバーがロックされました。

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

回避策として UNION を使用することに成功しました。

declare  @SearchTerm nvarchar(250)

SET @SearchTerm = '""'

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

UNION 

select UserId, U.Description, U.UserName
from dbo.Users U
WHERE CONTAINS( (U.Description, U.UserName), @SearchTerm)) 
于 2011-03-06T08:58:49.600 に答える
1

FTS と OR オペランドの問題は、SP2 CU4 で修正されました。そのレベル以降にいる場合は、UNION を使用しなくても、OR 条件は正常に実行されるはずです。SP2 CU8 のごく最近のアップデートを試したところ、FTS は OR で動作するようになりました。また、以前は失敗していた 3.12 などの検索も問題なく動作するようになりました。

于 2013-12-10T19:51:19.750 に答える