Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 使用SQL Server存储过程搜索多个关键字_Sql Server 2008_Stored Procedures_Keyword - Fatal编程技术网

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

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是我的存储过程的输入) 它工作得很好,但是如果用户输入几个关键词:苹果、橘子、香蕉呢 我应该限制关键字的数量吗?如果我有多个关键字,我应该如何编写存储过程?如何将用户输入传递到存储过程?我应该将苹果、

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

目前我使用的是这样的东西:

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
    所有结果生成查询。或者对每个令牌在循环中运行它,并将结果插入到临时表中
  • 如果您需要一些精确的结果(即只有记录匹配所有3个单词),您可以从上面构建的临时结果中选择大多数匹配结果。

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

    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是我最好的选择,我认为我应该限制关键字的数量,做一些像你说的那样的事,谢谢你的回答,但是这个搜索任何一个关键字,而不是所有的关键字。回答很好,但这会搜索任何关键字,而不是所有关键字。