2011-04-26 53 views
4

我在使用sql server全文功能时遇到问题。我正在转换一些论坛软件来使用全文搜索,并且我已经安装和运行了所有内容。我的问题与全文查询有关。我已经设计了运行根据需要几个疑问,当我使用CONTAINS谓词来定位我的搜索结果,如在SQL Server Management Studio中对其进行测试:参数化sql服务器中的全文查询

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

所以这个运行良好,但我怎么能在准备参数此声明?我非常希望能够与运行查询的WHERE子句,如:

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

甚至

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

但这种方法并不因为双引号和所有的工作。我可以在代码中动态构建搜索词,但出于安全原因,我确实需要为所有用户输入使用参数。我已经看到了数十亿谷歌搜索结果,试图找到一个解决方案,但不能(这肯定会发生在每个人身上,或者我错过了这里真正明显的东西和/或这是不可能的)。有任何想法吗?

+0

您是否试过使用两个单引号转义引号?即:WHERE Con​​tains(p.Message,'@ SearchTerm''Near''@OtherSearchTerm'') – garnertb 2011-04-26 19:25:41

+0

您是否曾经得到过一个确定的答案? – 2011-06-28 15:39:38

回答

0

字符串连接如何?

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

本答案演示了使用Enterprise Library 5.0在VB.NET中进行参数化的SQL Server全文搜索;并进一步显示每个“对象类型”返回十行(想象人,地点和事物)。

如下表和全文索引:

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