6

我在使用 sql server 全文功能时遇到问题。我正在将一些论坛软件转换为使用全文搜索,并且我已经完成了所有设置和工作。我的问题与全文查询有关。我设计了一些查询,当我使用 CONTAINS 谓词在 sql server management studio 中测试它们以定位我的搜索结果时,它们会根据需要运行,例如:

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

所以这运行良好,但我怎样才能在准备好的语句中参数化呢?理想情况下,我希望能够使用 where 子句运行查询,例如:

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

甚至

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

但是由于双引号等原因,这种方法不起作用。我可以在代码中动态构建搜索词,但出于安全原因,我确实需要为所有用户输入使用参数。我已经查看了无数的谷歌搜索结果,试图找到解决方案,但不能(当然这必须发生在每个人身上,或者我在这里遗漏了一些非常明显的东西和/或这是不可能的)。有任何想法吗?

4

3 回答 3

3

创建带有参数的存储过程,例如:

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

然后从您的代码中调用它。

如何:使用 Visual C# .NET 在 ASP.NET 中调用 SQL Server 存储过程

于 2014-06-23T20:14:47.563 回答
0

字符串连接怎么样?

WHERE Contains(p.Message, '"' + @SearchTerm + '" Near "' + @OtherSearchTerm + '"')
于 2011-04-26T19:25:26.710 回答
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
于 2013-12-16T23:26:16.153 回答