Подтвердить что ты не робот

7645 Нулевой или пустой полнотекстовый предикат

У меня есть запрос, который отлично работает на 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 или иметь оператор if с двумя разными случаями (выберите с FT join, выберите без FT соединения. Лучше обходной путь, который не требует этого?

4b9b3361

Ответ 1

Я нашел ответ на этот вопрос сегодня при конвертации моей собственной базы данных с 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, вы можете получить копию класса FullTextSearch E. W. Bachtal. Его сайт очень информативен: http://ewbi.blogs.com/develops/

Ответ 2

Это решение не работало для меня на SQL 2008. Ответ казался довольно ясным и был сочтен полезным, но я бы получил тайм-ауты на столе с записями 2M. Фактически он заблокировал сервер, который просто запускает запрос в SSMS.

Кажется, что это не похоже на OR в предложении where, но я мог бы выполнить запрос, разделяющий условия.

В итоге я успешно использовал 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)) 

Ответ 3

Проблема с FTS и операндом OR была исправлена ​​в SP2 CU4. Условие ИЛИ должно работать нормально, без СОЮЗА, если вы находитесь на этом уровне или позже. Мы попробовали недавнее обновление SP2 CU8 и FTS теперь работает с OR. Кроме того, поисковые запросы, такие как 3.12, которые не выполнялись до этого, теперь работают нормально.

Ответ 4

Только ADD Двойные кавычки. Вы можете проверить пустую строку, а затем добавить в нее двойные кавычки.

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

Здесь вы идете -

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