将空格分隔的字符串传递给存储过程以搜索整个数据库

时间:2017-04-06 19:05:45

标签: sql sql-server stored-procedures sql-server-2016

如何将分隔的字符串空间传递给存储过程并过滤结果?

我正在尝试这样做

parameter  value
__________________
@query     key1 key2 key 3

然后在存储过程中,我想先

  1. 使用key1查找所有结果。
  2. 使用key2过滤步骤1。
  3. 使用key3过滤step2。
  4. 另一个例子:

    col1        |       col2            | col3
    ------------+-----------------------+-----------------------------------
    hello xyz   |   abc is my last name | and I'm a developer
    hello xyz   |       null            | and I'm a developer
    

    如果我搜索任何后续内容,它应该返回每个?

    1. “xyz developer”返回2行
    2. “xyz abc”返回1行
    3. “abc developer”返回1行
    4. “hello”返回2行
    5. “hello developer”返回2行
    6. “xyz”返回2行
    7. 我正在使用SQL Server 2016.我尝试使用split_string来拆分查询字符串。但我不知道如何将其传递给存储过程。

      提前致谢

1 个答案:

答案 0 :(得分:1)

全文索引是可行的方法,但这会返回结果。

一个警告(我能想到)。如果您的搜索表达式/模式包含列名,则会生成误报

Declare @YourTable table (col1 varchar(50),col2 varchar(50),col3 varchar(50))
Insert Into @YourTable values
('hello xyz','abc is my last name','and I''m a developer'),
('hello xyz', null                ,'and I''m a developer')

Declare @Search varchar(max) =  'xyz abc'

Select A.*
 From  @YourTable A
 Cross Apply (Select FullString=(Select A.* FOR XML Raw)) B
 Where FullString like '%'+replace(@Search,' ','%')+'%'

返回

col1        col2                col3
hello xyz   abc is my last name and I'm a developer
  

编辑 - 多字/任意订单搜索

试试这个没有经过全面测试。我无法想象这是非常有效的,特别是对于更大的表和众多关键词

Declare @YourTable table (col1 varchar(50),col2 varchar(50),col3 varchar(50))
Insert Into @YourTable values
('hello xyz','abc is my last name','and I''m a developer'),
('hello xyz', null                ,'and I''m a developer')

Declare @Search varchar(max) =  'developer xyz'


Select *
 From  (
        Select Distinct A.*
              ,Hits = sum(sign(charindex(C.Value,B.FullString))) over (partition by B.FullString)
              ,Req  = C.Req
         From  @YourTable A
         Cross Apply (Select FullString=(Select A.* FOR XML Raw)) B
         Join  (Select *,Req=sum(1) over () From String_Split(@Search,' ') ) C on charindex(C.Value,B.FullString)>0
       ) A
 Where Hits=Req

http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=c77123a71c810716b36d73a92ac714eb