Sql server 2008 使用SQL Server存储过程搜索多个关键字
我将使用存储过程搜索我的数据库(SQLServer2008)。我的用户可以在文本框中输入关键字(例如,可以使用Sql server 2008 使用SQL Server存储过程搜索多个关键字,sql-server-2008,stored-procedures,keyword,Sql Server 2008,Stored Procedures,Keyword,我将使用存储过程搜索我的数据库(SQLServer2008)。我的用户可以在文本框中输入关键字(例如,可以使用,分隔关键字) 目前我使用的是这样的东西: keyword like N"%'+@SearchQuery%'%" (keyword是我的表中的nvarchar列,而@SearchQuery是我的存储过程的输入) 它工作得很好,但是如果用户输入几个关键词:苹果、橘子、香蕉呢 我应该限制关键字的数量吗?如果我有多个关键字,我应该如何编写存储过程?如何将用户输入传递到存储过程?我应该将苹果、
,
分隔关键字)
目前我使用的是这样的东西:
keyword like N"%'+@SearchQuery%'%"
(keyword
是我的表中的nvarchar
列,而@SearchQuery
是我的存储过程的输入)
它工作得很好,但是如果用户输入几个关键词:苹果、橘子、香蕉呢
我应该限制关键字的数量吗?如果我有多个关键字,我应该如何编写存储过程?如何将用户输入传递到存储过程?我应该将苹果、橘子、香蕉作为一个完整的短语传递,然后我应该在存储过程中解析它们,或者我应该分离我的关键字并发送3个关键字?如何查询这3个关键字?一个for循环
执行此类查询的最佳实践是什么
感谢您对应用程序中的关键字进行解析。SQL不是进行字符串操作的最佳场所 将关键字作为表值参数(即:)发送,这样就不会限制固定数量的关键字 将通配符添加到存储过程中的参数
update @keywords set keyword = '%'+keyword+'%'
通过将源数据加入此表来筛选结果
例如:
对应用程序中的关键字进行解析。SQL不是进行字符串操作的最佳场所 将关键字作为表值参数(即:)发送,这样就不会限制固定数量的关键字 将通配符添加到存储过程中的参数
update @keywords set keyword = '%'+keyword+'%'
通过将源数据加入此表来筛选结果
例如:
这取决于:
*你的数据库有多大。
*用户搜索某物的频率。
*如何精确的结果用户除外
LIKE
不是性能守护进程,尤其是以%
开头
也许你应该试试
如果您想继续使用like
(它只适用于小表),我会尝试以下方法:
,
字符拆分输入(按照建议将它们插入表中是个好主意)UNION
所有结果生成查询。或者对每个令牌在循环中运行它,并将结果插入到临时表中LIKE
不是性能守护进程,尤其是以%
开头
也许你应该试试
如果您想继续使用like
(它只适用于小表),我会尝试以下方法:
,
字符拆分输入(按照建议将它们插入表中是个好主意)UNION
所有结果生成查询。或者对每个令牌在循环中运行它,并将结果插入到临时表中如果您需要一些精确的结果(即只有记录匹配所有3个单词),您可以从上面生成的临时结果中选择大多数匹配结果。您可以使用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)
您可以使用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)
我认为LIKE是我最好的选择,我认为我应该限制关键字的数量,做一些像你说的那样的事情,谢谢我认为LIKE是我最好的选择,我认为我应该限制关键字的数量,做一些像你说的那样的事,谢谢你的回答,但是这个搜索任何一个关键字,而不是所有的关键字。回答很好,但这会搜索任何关键字,而不是所有关键字。