1

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

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

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

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

它工作得很好,但如果用户输入几个关键字怎么办:苹果、橙子、香蕉

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

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

谢谢

4

3 回答 3

5

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

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

将通配符添加到存储过程中的参数

update @keywords set keyword = '%'+keyword+'%'

通过将源数据连接到此表来过滤结果

例如:

SELECT result
FROM source 
    INNER JOIN @keywords keywords 
         ON source.keyword LIKE keywords.keyword
于 2012-07-27T08:51:47.353 回答
2

这取决于: * 你的数据库有多大。* 用户搜索某事的频率。* 用户结果如何精确除外。

LIKE不是性能守护进程,尤其是从%.

也许您应该尝试完整的搜索文本

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

  1. 按字符拆分输入(按照podiluska,的建议将它们插入表中是个好主意)。
  2. UNION为每个令牌和所有结果构建查询。或者为每个令牌循环运行它并将结果插入临时表。

如果您需要一些精确的结果(即只有记录匹配所有 3 个单词),您可以从上面构建的临时结果中选择最匹配的结果。

于 2012-07-27T08:53:33.127 回答
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
于 2012-07-27T09:01:17.370 回答