7645 Нулевой или пустой полнотекстовый предикат - PullRequest
36 голосов
/ 10 октября 2008

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

Ответы [ 4 ]

53 голосов
/ 07 декабря 2008

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

14 голосов
/ 06 марта 2011

Это решение не работало для меня в 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)) 
2 голосов
/ 09 августа 2017

Просто ДОБАВИТЬ Двойные кавычки. Вы можете проверить наличие пустой строки, а затем добавить в нее двойные кавычки.

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

Вот, пожалуйста -

where (@search_term = '""' or (FREETEXT(lst.search_text, @search_term)))
1 голос
/ 10 декабря 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...