使用SQL Server存储过程搜索多个关键字

时间:2012-07-27 08:41:39

标签: sql-server-2008 stored-procedures keyword

我将使用存储过程搜索我的数据库(SQL Server 2008)。我的用户可以在文本框中输入关键字(例如,可以使用,分隔关键字)。

目前我正在使用这样的东西:

keyword like N"%'+@SearchQuery%'%"

keyword是我的表中的nvarchar列,@SearchQuery是我的存储过程的输入)

它工作正常,但如果用户键入几个关键字:apple,orange,banana

我应该限制关键字的数量吗?如果我有多个关键字,我该如何编写存储过程?我应该如何将用户输入传递给存储过程?我应该将apple, orange, banana作为整个短语传递,然后我应该在我的存储过程中解析它们,或者我应该将我的关键字分开并发送3个关键字?如何查询这3个关键字?一个for循环?

执行此类查询的最佳做法是什么?

感谢

3 个答案:

答案 0 :(得分:5)

解析应用程序中的关键字。 SQL不是字符串操作的最佳位置。

将关键字作为表值参数发送(即:http://www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql-server-2008-and-net-c/),然后您不限于固定数量的关键字。

将通配符添加到存储过程

中的参数
update @keywords set keyword = '%'+keyword+'%'

通过将源数据加入此表来过滤结果

例如:

SELECT result
FROM source 
    INNER JOIN @keywords keywords 
         ON source.keyword LIKE keywords.keyword

答案 1 :(得分:2)

取决于:  *你的数据库有多大。  *用户搜索某些内容的频率。  *除了用户之外,用户的准确程度如何。

LIKE不是性能守护程序,尤其是从%开始。

也许你应该试试full search text

如果你想留在LIKE(它只适用于小桌子),我会尝试这样的事情:

  1. ,字符拆分输入(将它们作为podiluska建议插入表中是一个好主意)。
  2. 为每个令牌构建查询,并UNION所有结果。或者在每个令牌的循环中运行它并将结果插入临时表。
  3. 如果您需要一些精确的结果(即只有记录匹配所有3个单词),您可以从上面构建的临时结果中选择大多数匹配结果。

答案 2 :(得分:1)

您可以使用CTE在临时表中拆分关键字字符串,然后根据需要使用它。关键字列表甚至可以包含数字或任何字符,例如%$<>或者你想要什么,只记得逗号是字符串分隔符

DECLARE @CommaSeparatorString VARCHAR(MAX),
        @CommaSeparatorXML XML
DECLARE @handle INT
SELECT @CommaSeparatorString = 'apple,orange,banana'
SELECT @CommaSeparatorString = REPLACE(REPLACE(@CommaSeparatorString,'<','$^%'),'>','%^$')
SELECT @CommaSeparatorXML   =   CAST('<ROOT><i>' + REPLACE(@CommaSeparatorString, ',', '</i><i>') + '</i></ROOT>' AS XML) 

SELECT REPLACE(REPLACE(c.value('.', 'VARCHAR(100)'),'$^%','<'),'%^$','>') AS ID
  FROM (SELECT @CommaSeparatorXML AS CommaXML) a
 CROSS APPLY CommaXML.nodes('//i') x(c)

结果:

  ID
------
apple
orange
banana