我将使用存储过程搜索我的数据库(SQL Server 2008)。我的用户可以在文本框中输入关键字(例如,可以使用,
分隔关键字)。
目前我正在使用这样的东西:
keyword like N"%'+@SearchQuery%'%"
(keyword
是我的表中的nvarchar
列,@SearchQuery
是我的存储过程的输入)
它工作正常,但如果用户键入几个关键字:apple,orange,banana
我应该限制关键字的数量吗?如果我有多个关键字,我该如何编写存储过程?我应该如何将用户输入传递给存储过程?我应该将apple, orange, banana
作为整个短语传递,然后我应该在我的存储过程中解析它们,或者我应该将我的关键字分开并发送3个关键字?如何查询这3个关键字?一个for循环?
执行此类查询的最佳做法是什么?
感谢
答案 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
(它只适用于小桌子),我会尝试这样的事情:
,
字符拆分输入(将它们作为podiluska建议插入表中是一个好主意)。UNION
所有结果。或者在每个令牌的循环中运行它并将结果插入临时表。如果您需要一些精确的结果(即只有记录匹配所有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