在sql server中参数化全文查询
Posted
技术标签:
【中文标题】在sql server中参数化全文查询【英文标题】:Parameterizing a full text query in sql server 【发布时间】:2011-08-13 07:30:52 【问题描述】:我在使用 sql server 全文功能时遇到问题。我正在将一些论坛软件转换为使用全文搜索,并且我已经完成了所有设置和工作。我的问题与全文查询有关。我设计了一些查询,当我在 sql server management studio 中使用 CONTAINS 谓词来定位我的搜索结果时,它们会根据需要运行,例如:
Select ....
From .....
WHERE Contains(p.Message,'" dog food "' ) ......
所以这运行良好,但我如何在准备好的语句中对其进行参数化?理想情况下,我希望能够使用 where 子句运行查询,例如:
Select ....
From .....
WHERE Contains(p.Message,'" @SearchTerm "' ) ...
甚至
WHERE Contains(p.Message,'"@SearchTerm" Near "@OtherSearchTerm" ) ...
但是由于双引号等原因,这种方法不起作用。我可以在代码中动态构建搜索词,但出于安全原因,我确实需要为所有用户输入使用参数。我查看了无数的谷歌搜索结果,试图找到一个解决方案,但不能(当然这必须发生在每个人身上,或者我在这里遗漏了一些非常明显的东西和/或这是不可能的)。有任何想法吗?
【问题讨论】:
你试过用两个单引号转义引号吗?即:WHERE Contains(p.Message,''@SearchTerm'' Near ''@OtherSearchTerm'') 你有没有得到一个明确的答案? 【参考方案1】:创建一个带参数的存储过程,比如:
CREATE PROCEDURE [sp_FullTextSearch]
@SearchTerm nvarchar(500)
AS
BEGIN
Select ....
From .....
WHERE Contains(p.Message, @SearchTerm)
END
然后从您的代码中调用它。
HOW TO: Call SQL Server Stored Procedures in ASP.NET by Using Visual C# .NET
【讨论】:
【参考方案2】:字符串连接怎么样?
WHERE Contains(p.Message, '"' + @SearchTerm + '" Near "' + @OtherSearchTerm + '"')
【讨论】:
【参考方案3】:此答案演示了使用 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
【讨论】:
以上是关于在sql server中参数化全文查询的主要内容,如果未能解决你的问题,请参考以下文章
Sql Server参数化查询之where in和like实现详解
转载Sql Server参数化查询之where in和like实现详解
Sql Server参数化查询之where in和like实现详解
SQL Server参数化SQL语句中的like和in查询的语法(C#)