2012-07-27 109 views
1

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

目前我使用这样的事情:

keyword like N"%'[email protected]%'%" 

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

它工作正常,但如果用户键入几个关键字:苹果,橙子,香蕉

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

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

谢谢

回答

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 
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 
+0

伟大的答案,但这个搜索任何关键字,而不是全部关键字。 – zax 2015-05-25 00:28:55

2

这取决于: *你的数据库有多大。 *用户多久搜索一次。 *用户除了精确的结果。

LIKE不是性能守护进程,特别是从%开始。

也许你应该试试full search text

如果你想住宿LIKE(它将只适用于小表),我会尝试这样的:

  1. 斯普利特,字符intput(将它们插入到表作为podiluska建议是一个好主意) 。
  2. 构建查询每个令牌和UNION所有结果。或者在每个令牌的循环中运行它并将结果插入到临时表中。

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

+0

我觉得LIKE是我最好的选择,我想我应该限制关键词的数量,并且做一些类似于你所说的话,谢谢 – 2012-07-27 08:57:50