2017-04-06 17 views
1

如何將分隔字符串空間傳遞給存儲過程並過濾結果?將空格分隔的字符串傳遞給存儲過程以搜索整個數據庫

我想在存儲過程中要做到這一點

parameter value 
__________________ 
@query  key1 key2 key 3 

然後,我想先

  1. 找到所有與key1的結果。
  2. 使用key2過濾步驟1。
  3. 使用key3過濾第2步。

又如:

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顯影劑」 返回2行
  2. 「XYZ ABC」 返回1行
  3. 「ABC顯影劑」 返回1行
  4. 「你好」 返回2行
  5. 「你好顯影劑」 返回2行
  6. 「XYZ」 返回2行

我使用SQL Server 2016我試圖用split_string來分割查詢字符串。但我不知道如何將它傳遞給存儲過程。

在此先感謝

+2

這真是一個可怕的設計。你不應該有複合數據 - 這就是你正在談論的 - 存儲在一個參數中。將它們分成它們自己的參數。當一個存儲過程能夠使用多個參數時,爲什麼會讓自己很難? –

+4

我認爲你應該考慮全文索引。這似乎有你正在尋找的功能。 –

+0

@rory。ap在sql server 2016中的string_split函數會分割我的字符串空間,我在split_string上做了一個連接並試圖進行搜索。另一個問題是,我在5個表中留下了外部連接,這導致了性能問題。 – ISHIDA

回答

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

+0

如果我要搜索開發人員,是否返回2個結果? – ISHIDA

+0

@ISHIDA是的它確實 –

+0

@ISHIDA要清楚,它是一種模式搜索,所以「Developer XYZ」將不會返回任何記錄 –

相關問題