Почему мой SQL-запрос пытается преобразовать значение nvarchar в int? (используя CONTAINSTABLE())

#sql #sql-server-2008 #full-text-search #full-text-indexing

#sql #sql-server-2008 #полнотекстовый поиск #полнотекстовое индексирование

Вопрос:

Я пытаюсь заставить полнотекстовый поиск работать в SQL Server 2008 R2. Я работал с нашим администратором, и мы считаем, что у нас есть каталог с успешно настроенными индексами. Теперь я пытаюсь запросить индексированную таблицу, используя полнотекстовые функции

Это работает без проблем:

 select *
from mPages
where contains(bodytext, ' "a dog" ')
  

Однако, когда я пытаюсь получить значения ранга с помощью containstable() , я получаю сообщение об ошибке.

 select mPages.bodytext, KEY_TBL.RANK
from mPages
     INNER JOIN
     CONTAINSTABLE(mPages, bodyText,
                    'dog') AS KEY_TBL
     ON mPages.pageID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
  

Ошибка:

 Msg 245, Level 16, State 1, Line 2
Conversion failed when converting the nvarchar value 'About' to data type int.
  

Значение «About» находится в столбце с именем pagename . Я не понимаю, как устранить эту ошибку.

Любая помощь?

Ответ №1:

Вероятно, он жалуется на эту строку:

 ON mPages.pageID = KEY_TBL.[KEY]
  

Предполагая, что pageID это int , он попытается преобразовать key в int , чтобы можно было сравнить столбцы. Преобразование происходит не так, как планировалось.

Комментарии:

1. Я в замешательстве. Нет, где я сказал ему использовать pagename в качестве ключа. есть ли способ вручную установить ключ равным pageID ?

2. @quakkels: Проверьте свойство `TableFulltextKeyColumn` в вашем полнотекстовом индексе. Вы можете сделать это в SQL с помощью view sys.fulltext_indexes

3. Я вижу столбец с именем, unique_index_id и его значение 2 . Не уверен, что это значит.

4. @quakkels: Вероятно, означает, что в качестве ключа используется второй столбец?

5. хммм … это было бы pagename вместо pageID . Могу ли я просто обновить это представление до 1 ?