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ステートメントを使用したりできることはわかっています。
今日、自分のデータベースを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/
この解決策は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))
二重引用符を追加するだけです。空の文字列をチェックして、二重引用符を追加できます。
Set @search_term = case when @search_term = '' then '""' else @Address End
どうぞ -
where (@search_term = '""' or (FREETEXT(lst.search_text, @search_term)))
FTSおよびORオペランドの問題は、SP2 CU4で修正されました。OR条件は、そのレベル以降であれば、UNIONを実行しなくても正常に実行されます。 。SP2 CU8の最新アップデートを試しましたが、FTSはORで動作します。また、3.12などの検索は、以前は失敗していましたが、正常に機能します。