web-dev-qa-db-ja.com

7645 Nullまたは空のフルテキスト述語

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ステートメントを使用したりできることはわかっています。

37
mjallday

今日、自分のデータベースを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/

54
NotMe

この解決策は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)) 
14
whiplashtony

二重引用符を追加するだけです。空の文字列をチェックして、二重引用符を追加できます。

Set @search_term = case when @search_term = '' then '""' else @Address End

どうぞ -

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

FTSおよびORオペランドの問題は、SP2 CU4で修正されました。OR条件は、そのレベル以降であれば、UNIONを実行しなくても正常に実行されます。 。SP2 CU8の最新アップデートを試しましたが、FTSはORで動作します。また、3.12などの検索は、以前は失敗していましたが、正常に機能します。

1
beachboy301