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 соединения. Лучше обходной путь, который не требует этого?
Ответы
Ответ 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)))