Создание хранимой процедуры в SQL Server 2008, которая будет выполнять «поиск в Facebook» - PullRequest
2 голосов
/ 08 июня 2010

Я пытаюсь включить поиск в Facebook в моей системе (автоматическое предложение при наборе текста).Мне удалось закодировать все вещи Ajax, но я не уверен, как сделать запрос к базе данных.

Я создал таблицу с именем People, которая содержит поля: ID, FirstName, LastName, MiddleName,Эл. адрес.Я также создал FTS-индекс для всех этих полей.

Я хочу создать хранимую процедуру, которая будет получать в качестве параметра текст, вставленный в поле запроса, и возвращает предложения.

Например, когда я напишу в текстовом поле запрос "Joh Do", он будет переведен в запрос:

select * from People where contains(*, '"Joh*"') and contains(*, '"Do*"')

Есть ли способ сделать это в хранимой процедуре?

PS Я пытался использовать синтаксис

select * from People where contains(*,'"Joh*" and "Do*"')

, но он не дал ожидаемых результатов, вероятно, потому что ему нужно искать слова в разных полях.Есть ли способ это исправить?

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 июня 2010

Проблема заключается в природе аргумента в открытом списке. Я могу быть Joh, это может быть Joh Do, это может быть Joh Do Na и так далее и так далее. У вас есть две основные альтернативы:

  • анализирует ввод в веб-приложении (я полагаю, в ASP) и затем вызывает соответствующую процедуру для количества записей (т. Е. exec usp_findSuggestions1 'Joh', exec usp_findSuggestions2 'Joh', 'Do', exec usp_findSuggestions1 'Joh', 'Do', 'Na'). В первой процедуре используется 1 contains, во второй - 2 contains .. and contains ..., а в последней - 3. Это может показаться совершенно безобразным с точки зрения DRY, разработки кода и особенно обслуживания кода, но на самом деле это лучшее решение для T- SQL касается, прежде всего, плановой стабильности этих запросов.
  • передает входные данные прямо в одну хранимую процедуру, где вы можете разбить ее на компоненты и построить динамический запрос T-SQL с таким количеством contains, сколько необходимо.

Оба решения несовершенны. В конечном счете, у вас есть две проблемы, и обе они были исследованы достаточно подробно:

1 голос
/ 08 июня 2010

Попробуйте

select   *
from     People
where    (FirstName  Like '%'+ @FirstName  + '%') and
         (MiddleName Like '%'+ @MiddleName + '%') and
         (LastName   Like '%'+ @LastName   + '%')

Также вы можете захотеть ограничить результаты, возвращая максимум, скажем, 10, используя:

select top 10

РЕДАКТИРОВАТЬ 1:

Хорошо, теперь я понимаю проблему лучше. Я бы использовал динамический sql таким образом:

Сначала создайте функцию разделения, например, Пример функции Split с использованием трюка XML

Затем используйте динамический sql:

declare @tstr varchar (500)

set @tstr = ''

select  @tstr =@tstr + ' Contains(*, ''"'+ val + '*")' + ' and '
from  dbo.split(@SearchStr, ' ') 


set @tstr =  left(@tstr,len(@tstr)-4)

select @tstr
Declare @dsql as varchar(500)

set @dsql = 'select * from People where '+ @tstr

exec (@dsql)

Также, пожалуйста, обратите внимание, что согласно Remus, помните о SQL-инъекциях, лучше использовать sp_executesql (вместо EXEC).

0 голосов
/ 08 июня 2010

AJAX Toolkit имеет элемент управления «Автозаполнение», который предоставляет эти функции сразу после установки Это очень просто в использовании.

Посмотрите на образец здесь

...