Параметризация полнотекстового запроса на сервере SQL - PullRequest
5 голосов
/ 26 апреля 2011

У меня проблема с использованием полнотекстовой функции сервера sql. Я конвертирую некоторые программы для форума, чтобы использовать полнотекстовый поиск, и у меня все настроено и работает. Мои проблемы связаны с полнотекстовыми запросами. Я разработал несколько запросов, которые выполняются по желанию, когда я тестирую их в студии управления SQL-сервером, используя предикат CONTAINS для поиска результатов поиска, например:

Select ....
From ..... 
WHERE Contains(p.Message,'" dog food "' ) ......

Так что это работает нормально, но как я могу параметризовать это в подготовленном утверждении? В идеале я хотел бы иметь возможность выполнить запрос с предложением where, например:

Select ....
From ..... 
WHERE Contains(p.Message,'" @SearchTerm "' ) ...

или даже

WHERE Contains(p.Message,'"@SearchTerm" Near "@OtherSearchTerm" ) ...

Но этот подход не работает из-за двойных кавычек и всего. Я мог бы динамически создавать поисковый термин в коде, но мне действительно нужно использовать параметры для всего пользовательского ввода по соображениям безопасности. Я посмотрел на миллион результатов Google, пытаясь найти решение, но не могу (Конечно, это должно случиться у всех, или я упускаю что-то действительно очевидное здесь и / или это невозможно). Есть идеи?

Ответы [ 3 ]

3 голосов
/ 24 июня 2014

Создайте хранимую процедуру с параметрами, такими как:

CREATE PROCEDURE [sp_FullTextSearch] 
    @SearchTerm nvarchar(500)
AS
BEGIN
    Select ....
    From ..... 
    WHERE Contains(p.Message, @SearchTerm)
END

Затем вызовите ее из своего кода.

КАК: вызвать хранимые процедуры SQL Server в ASP.NET с помощьюИспользование Visual C # .NET

0 голосов
/ 17 декабря 2013

Этот ответ демонстрирует параметризованный полнотекстовый поиск SQL Server в VB.NET с использованием Enterprise Library 5.0;и далее показано возвращение десяти строк для каждого «типа объекта» (подумайте о людях, местах и ​​вещах).

С учетом следующей таблицы и полнотекстового индекса:

CREATE TABLE [dbo].[SearchIndexes](
    [SearchIndexId] [int] IDENTITY(1,1) NOT NULL,
    [ObjectKey] [nvarchar](50) NOT NULL,
    [ObjectText] [nvarchar](4000) NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [ObjectTypeId] [int] NOT NULL,
 CONSTRAINT [PK_SearchIndexes] PRIMARY KEY CLUSTERED 
(
    [SearchIndexId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE FULLTEXT INDEX ON [dbo].[SearchIndexes](
[ObjectText] LANGUAGE [English])
KEY INDEX [PK_SearchIndexes] ON ([MyDbFullTextCatalog], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)

Код:

Public Function FullTextSearch(text As String) As System.Collections.Generic.List(Of String)

  Const SqlFormat As String = "with RankCte as (select ObjectText, Row_number() over (Partition BY ObjectTypeId ORDER BY ObjectText ) AS RowNum FROM dbo.SearchIndexes where contains(ObjectText, @ObjectTextParameter)) SELECT ObjectText FROM RankCte where RowNum <= 10"
  Const ParameterFormat As String = """{0}*"""

  Dim db = Databases.MyDb

  Using command = db.GetSqlStringCommand(SqlFormat)
    Dim parameterValue = String.Format(Globalization.CultureInfo.InvariantCulture, ParameterFormat, text)
    'parameterValue should now be something like "search*" (includes the double quotes)

    db.AddInParameter(command, "ObjectTextParameter", DbType.String, parameterValue)

    Using reader = db.ExecuteReader(command)
      Dim results As New List(Of String)
      Do While reader.Read()
        results.Add(reader(0).ToString)
      Loop
      Return results
    End Using
  End Using
End Function
0 голосов
/ 26 апреля 2011

Как насчет конкатенации строк?

WHERE Contains(p.Message, '"' + @SearchTerm + '" Near "' + @OtherSearchTerm + '"')
...